考虑格式为d1.d2d3d4d5 ... dnExxx的十进制表示形式,其中xxx是任意指数,并且d1和dn都不为零。可能影响双精度的最大小数位数
是已知的最大值n,因此存在十进制表示d1.d2d3d4d5 ... dnExxx,使得间隔(d1.d2d3d4d5 ... dnExxx,d1.d2d3d4d5 ...((dn)+1)Exxx )包含一个IEEE 754双?
n应至少为17的问题是如何大大高于17
这个数字N是与数字的个数,这是不够的十进制到双转换这样的考虑如strtod()
。我查看了David M. Gay's implementation的源代码,希望在那里找到答案。有一个暗示“40”,但不清楚这是否是一个良好的数学结果或只是一个统计上安全的界限的结果。此外,有关“截断”的注释使其听起来像0.500000000000000000000000000000000000000000000001可能会在向上模式中转换为0.5。
Musl's implementation似乎读取大约125 * 9位数,这是很多。然后切换到“粘”模式:
if (c!='0') x[KMAX-4] |= 1;
最后,如何回答时,改变代以“包含一个IEEE 754双”与“包含两个连续的IEEE 754双精度的中点”?
我不确定我是否理解这一点。例如,'2 ^( - 1074)'有751个有效的十进制数字,因此有一个十进制表示'd1.d2 ...d750E-324'满足条件(你可以得到更长的,但不是很多)。但是,您只需要少数这些数字来确定最接近的IEEE754“double”。 –
@DanielFischer但是2 ^( - 1074)不在排他区间(d1.d2 ... d750E-324,d1.d2 ...(d750 + 1)E-324)。顺便说一下(d750 + 1)如果d750是“9”,则会轻微地滥用符号。这种滥用也在我的问题中,但替代方案(d1.d2 ... d750E-324,(d1.d2 ... d750E-324 + 1E-1074))也令人困惑。我甚至可能让指数错误。 –
我使用的数字少于确切的表示,所以它处于开放间隔。 –