gpt4 book ai didi

c - 往返文本和返回

转载 作者:太空宇宙 更新时间:2023-11-04 05:11:29 24 4
gpt4 key购买 nike

使用 Cocoa 或基本 c,如何将 double 转换为字符串表示形式,然后将其转换回完全相同的 double 。可读性并不重要,只有准确性才重要。例如,这行得通吗:
双 a,b;
a=一些值;
b=[[[NSNumber numberWithDouble:a] stringValue] doubleValue];

最佳答案

[编辑] 实际上在 C99 中有一种方法可以做到这一点——使用 %a 格式说明符。这会打印出一个 double 的十六进制科学记数法,因此没有精度损失。结果是准确的。示例:

double d1 = 3.14159;
char str[64];
sprintf(str, "%a", d1);
// str is now something like "0x1.921f9f01b866ep+1"
...
double d2;
sscanf(str, "%la", &d2);
assert(d2 == d1);

原回答如下:


大多数 double 到字符串的转换都不能保证这一点。您可以尝试以非常高的精度打印出 double(一个 double 可以存储大约 16 位十进制数字),但仍有很小的可能出现浮点错误:

// Not guaranteed to work:
double d = ...;
char str[64];
sprintf(str, "%.30g", d);
...
double d2;
sscanf(str, "%g", &d2);

这将以非常高的精度工作,但它仍然可能有几个 ULP(最后一位的单位)的误差。

你在做什么,要求你在使用字符串时产生 100% 完全可重现的值?我强烈建议你重新考虑你想做什么。如果您确实需要精确转换,只需将 double 存储为 8 个字节的二进制文件。如果需要以可打印的格式存储,将二进制数据转换成十六进制(16字节)或base 64。

关于c - 往返文本和返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1893967/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com