【发布时间】:2015-11-15 06:49:49
【问题描述】:
我希望能够打印出一个双精度数,它与 C 语言中的原始十进制数相同。
char buf[1000];
double d = ______;
如果是双份的话,我愿意
snprintf(buf, sizeof(buf), "%.17g", .1);
但它会打印出来:printf("%s", buf);
0.10000000000000001
最后一个1 是舍入错误
如果您尝试表示 .1,它会打印出最接近的十进制表示双精度值。将.1 转换为加倍,会出现舍入错误。转换回十进制,你会得到另一个四舍五入的错误。
有没有办法解决这个问题?
【问题讨论】:
-
有点不清楚您是在询问 IEEE-754 双精度浮点格式 的限制,还是在询问如何解决它。请澄清。
-
@DavidC.Rankin 您能否解释一下 IEEE-754 双精度浮点格式的限制以及如何解决上述问题。我很想知道
-
@psyco 限制具有误导性。二进制表示意味着许多具有精确十进制表示的值无法准确表示。但是,这是设计使然,二进制浮点具有许多优点。对于它的预期用途,我认为不可能有更好的设计。
-
@psyco 是另一个 David 和 Jens,并且已经解释得更加雄辩了。我唯一要补充的是,您面临的问题是由于可用于描述所有可能的浮点值的位数有限。 IEEE-754 双精度格式使用 1 位符号位,11 位用于指数,在 64 位中仅留下 52 位用于余数,称为尾数或有效位。根本没有足够的位来准确地唯一描述所有可能的浮点值。