【发布时间】:2018-01-23 20:43:54
【问题描述】:
我试图在字符串中表示双精度,为此我使用了 grisu 的算法,你可以在这里查看:https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf
我已经完成了,显然正在工作,当我与 printf 输出进行高精度比较时,我的问题是:
double u = 1, t = 3;
double co = u/t;
printf("%.100f", co);
输出
0.3333333333333333148296162562473909929394721984863281250000000000000000000000000000000000000000000000
使用 grisu 的算法,我可以获得以下结果:
3333333333333333e-16
什么是逻辑,因为您可以使用 double 获得的最大精度为 21 位,您可以在 PDF 中的“5.3 C 实现”(第 6 页)中阅读。那么如果我的最大精度是这个,或者哪个算法正在使用 printf 来获得这个精度,我怎么能得到其余的呢?
【问题讨论】:
-
您为什么认为 53 位二进制精度接近 21 位十进制精度?
-
你的意思是用 53 位尾数我不能得到这个?
-
log10(pow(2, 53))不是21。 -
@Ripi2 不,你确实不会得到垃圾。你得到 exact 值的 base-10 表示,就像它在 base-2 中一样。
-
@KeithThompson:C 2011 [N1570] 5.2.4.2.2 6:“浮点运算(+、-、*、/)和
和 是实现定义的,正如 、 和 。实现可能会声明准确性未知。”
标签: c algorithm floating-point double ieee-754