Floating point 可影响双精度计数器的最大小数位数

Floating point 可影响双精度计数器的最大小数位数,floating-point,ieee-754,Floating Point,Ieee 754,考虑形式为d1.D2D3D5D5…dnExxx的十进制表示,其中xxx是任意指数,d1和dn均为非零 已知的最大n是否存在十进制表示法d1.d2d3d4d5…dnExxx,从而区间(d1.d2d3d4d5…dnExxx,d1.d2d3d4d5…((dn)+1)Exxx)包含IEEE 754双精度 n应至少为17。问题是17岁以上有多少 这个数N与在十进制到双转换中足够考虑的位数,如 SttoDo()/有关。我查看了源代码,希望在那里找到答案。有人暗指“40”,但不清楚这是一个可靠的数学结果的结果

考虑形式为d1.D2D3D5D5…dnExxx的十进制表示,其中xxx是任意指数,d1和dn均为非零

已知的最大n是否存在十进制表示法d1.d2d3d4d5…dnExxx,从而区间(d1.d2d3d4d5…dnExxx,d1.d2d3d4d5…((dn)+1)Exxx)包含IEEE 754双精度

n应至少为17。问题是17岁以上有多少

这个数N与在十进制到双转换中足够考虑的位数,如<代码> SttoDo()/<代码>有关。我查看了源代码,希望在那里找到答案。有人暗指“40”,但不清楚这是一个可靠的数学结果的结果,还是统计上的安全界限。此外,关于“截断”的注释使其听起来像0.5000000000000000000000000000000000000001可以在向上舍入模式下转换为0.5

似乎读取了大约125*9个数字,这是很多。然后切换到“粘性”模式:

if (c!='0') x[KMAX-4] |= 1;

最后,如果将“包含一个IEEE 754双精度”替换为“包含两个连续IEEE 754双精度的中点”,则答案会发生怎样的变化?

当您有一个具有奇数有效位的次正常数,即
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)
如果我们考虑“包含两个连续的IEEE75 4<代码>中值“双/代码> s”的中点,则由于低于正常值<代码>双S都具有大致相同的显著小数位数,并且中间点也连续两次这样。

在最坏的情况下,必须使用整个数字序列(考虑在最后1之前具有任意多个零的
“0.5000000…0001”
,该1确定结果应为
0.5+0.5^53
,而不是
0.5
,从零取整或向上取整)

然而,只有

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

区分不同的
double
值所需的有效十进制数字,因此一种相对简单(尽管可能不是很有效)的解析方法是将第一个(至少17个)数字(和指数)解析为最接近的
double
,并将输入字符串与该
double
值(及其相邻值)的精确表示形式进行比较。

我不确定我是否理解这一点。例如,
2^(-1074)
有751个有效的十进制数字,因此有一个满足条件的十进制表示法
d1.d2…d750E-324
(可以得到更长的,但不多)。但是您只需要这些数字中的一小部分就可以确定最近的IEEE754
double
@DanielFischer,但是2^(-1074)不在独占间隔内(d1.d2…d750E-324,d1.d2…(d750+1)E-324)。顺便说一下,如果d750是一个“9”,那么(d750+1)是对符号的轻微滥用。这种滥用也是我的问题,但备选方案(d1.d2…d750E-324,(d1.d2…d750E-324+1E-1074))也令人困惑。我甚至可能弄错了指数。我使用的数字比精确表示的数字少了一位,所以它是在开放区间内。我想你的问题是,你想/需要以舍入模式而不是“到最近”进行有效解析,对吗?@DanielFischer我试着写问题,以便第一部分,直到最后一句,是关于直接模式的转换,最后一句是关于从四舍五入到最近模式的转换。现在在我看来,这两个答案差别很大(750+和17),但我仍然认为我还是设法提出了正确的问题。我不相信你的论点,即17位数就足够了。看看1+45/2^53和1+46/2^53<代码>1.00000000000000505向下舍入,但
1.000000000000005059
向上舍入。差异在小数点后18位。@tmyklebu没有值为
1+45/2^53
的IEEE754
double
。这需要54位精度来表示。在
1+46/2^53
之后的下一个较小的数字是
1+44/2^53=1.00000000000000 488498130835068777863979339599609375
。我认为“这个双精度很好地打印在十进制中,17个有效数字四舍五入到最近,所以如果我分析它(四舍五入到最近),我肯定会得到原始的双精度”和“我只需要读17个任意的十进制数字序列来知道最接近的两个”。第一个作品,但第二个不,是吗?仍然试图理解,大声思考……PasCaluoq正确,这就是它。考虑(2 ^ -1022-2^ 1074)-两次Fmin范式的前身-它需要767位数。