2013-06-21 58 views
5

考虑格式为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双精度的中点”?

+1

我不确定我是否理解这一点。例如,'2 ^( - 1074)'有751个有效的十进制数字,因此有一个十进制表示'd1.d2 ...d750E-324'满足条件(你可以得到更长的,但不是很多)。但是,您只需要少数这些数字来确定最接近的IEEE754“double”。 –

+1

@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))也令人困惑。我甚至可能让指数错误。 –

+1

我使用的数字少于确切的表示,所以它处于开放间隔。 –

回答

6

当你有奇数尾数次正规数,也就是2^(-1074)的奇数倍,你有一个数字,其最后一个非零数字十进制表示是1074 小数点后。然后,直接在小数点后面有大约300个零,因此该数字有大约750-770个重要的小数位数。最小的正数低于正常值,2^(-1074)有751个有效数字,最大正数低于正常数,(2^52-1)*2^(-1074)有767个有效数字(我认为这是最大值)。

那么至少有一个十进制数字序列d1, ..., d766这样,有一个IEEE754 double在开区间

(d1.d2...d766E-308, d1.d2...(d766 + 1)E-308) 

如果我们认为答案不会改变多少“包含两个连续的IEEE754的中点double s“,因为低于正常值的double s具有大致相同数量的重要小数位数,并且两个连续数的中点也是如此。

在最坏的情况下,整个数字序列必须消耗(从0或至多舍去当最终1,其确定的结果应该是0.5 + 0.5^53,而不是之前0.5考虑"0.5000000...0001"与任意许多零)。

但是,也有只

floor(DBL_MANT_DIG * log 2/log 10) + 2 = 17 

显著小数必要不同double值之间进行区分的数字,所以相对容易的,尽管可能不是非常有效的,解析的方法将是解析第一个(至少17)数字(和指数)到最近的double,并将输入字符串与double值(及其邻居)的确切表示进行比较。

+0

感谢您的回答。我试图确定的数字n是在安全转到“粘性”模式之前必须在正常模式下解析的小数位数。可以建立任意长的十进制序列,如0.50000 ... 00001,但过了一段时间后,是否仍然存在一个非零数字才重要,我想回答的问题是“在多少位数之后,完全是?”。我仍然需要思考直接模式和最近模式之间的区别,但是您对我的帮助很大。 –

+1

我不认为我买你17个数字就足够的论点。看看1 + 45/2^53和1 + 46/2^53。 '1.00000000000000505'向下舍去,但是'1.000000000000005059'向上舍入。差异在小数点后18位。 – tmyklebu

+1

@tmyklebu没有IEEE754'double',值为'1 + 45/2^53'。这需要54位精度来表示。 '1 + 46/2^53'后的下一个较小的是'1 + 44/2^53 = 1.000000000000004884981308350688777863979339599609375'。 –