Floating point 91 / 36028797018963968. 不幸的是,分子太大了;它大于253(9007199254740992)。因此浮点硬件无法返回该数字。它必须以某种方式使它适合

Floating point 91 / 36028797018963968. 不幸的是,分子太大了;它大于253(9007199254740992)。因此浮点硬件无法返回该数字。它必须以某种方式使它适合,floating-point,precision,floating-accuracy,Floating Point,Precision,Floating Accuracy,如果我们把分子和分母除以二,我们得到了5404319552844595.5/18014398509481984。该值相同,但分子不是整数。为了使其适合,硬件将其舍入为整数。当分数正好为1/2时,规则是四舍五入以使结果相等,因此硬件返回5404319552844596/18014398509481984 接下来,我们取当前的总和5404319552844596/18014398509481984,再加上3602879701896397/36028797018963968。这一次,总额为720575

如果我们把分子和分母除以二,我们得到了5404319552844595.5/18014398509481984。该值相同,但分子不是整数。为了使其适合,硬件将其舍入为整数。当分数正好为1/2时,规则是四舍五入以使结果相等,因此硬件返回5404319552844596/18014398509481984

接下来,我们取当前的总和5404319552844596/18014398509481984,再加上3602879701896397/36028797018963968。这一次,总额为7205759403792794.5/18014398509481984。在本例中,硬件向下舍入,返回7205759403792794/18014398509481984

然后我们加上7205759403792794/18014398509481984和3602879701896397/36028797018963968,总数为9007199254740992.5/18014398509481984。注意,分子不仅有一个分数,而且大于253。因此,我们必须再次减少它,这将产生4503599627370496.25/9007199254740992。将分子四舍五入为整数将生成4503599627370496/9007199254740992

这正好是1/2。在这一点上,舍入误差恰好被消除;加1等于收益率的五倍

当我们添加4503599627370496/9007199254740992和3602879701896397/36028797018963968时,结果正好是5404319552844595.25/9007199254740992。硬件向下舍入并返回5404319552844595/9007199254740992

现在你可以看到,我们将重复进行四舍五入。要将3602879701896397/36028797018963968添加到累加和中,硬件必须将其分子除以四以使其匹配。这意味着分数部分总是0.25,它将被四舍五入。因此,接下来的四个总和也被舍入。我们最终得到的是9007199254740991/9007199254740992,比1小

使用
float
而不是
double
,分子必须适合24位,因此必须小于224(16777216)。所以123456789在做任何运算之前都太大了。它必须表示为15432099•23,即123456792。加1的精确数学结果是15432099.125•23,有效位四舍五入为整数得到15432099•23,因此没有变化。但是,如果加上四个,结果是15432099.5•23,四舍五入为15432100•23