【问题标题】:are computations with large floats less accurate then with small floats使用大浮点数的计算比使用小浮点数的计算精度低吗
【发布时间】:2016-01-07 17:12:33
【问题描述】:

这个说法正确吗? :

由于计算机上浮点数的对数分布,大数字的计算不太准确。

这意味着使用 1 左右的值进行计算更准确(因为舍入误差),然后使用 1e20 对每个数字进行缩放的相同计算?

【问题讨论】:

    标签: precision computer-architecture floating-accuracy numerics


    【解决方案1】:

    简答:

    是的,这句话是正确的,较大的浮点数不如较小的精确。

    详情:

    浮点数具有分配给mantissa 的固定位数。如果所表示的数字需要的位数多于尾数中的位数,则将对其进行四舍五入。因此可以更精确地表示较小的数字。

    为了使这更具体,我编写了以下程序,它将逐渐减小的值添加到大浮点数和小浮点数。另外为了显示差异,我包括了一个没有舍入的双精度浮点。但是如果尾数更大,双倍也会遇到同样的问题。

    #include <stdio.h>
    
    int main() {
      float large_float, small_float, epsilon;
      double large_double, small_double;
    
      large_float = 1 << 20;
      small_float = 1;
      epsilon = 0.1;
    
      large_double = large_float;
      small_double = small_float;
    
      printf("large_float\t large_double\t small_float\t small_double\t epsilon\n");
    
      for(int i = 0; i < 10; i++) {
        printf("%f\t %f\t %f\t %f\t %f\n", large_float, large_double,small_float, small_double, epsilon);
        large_float += epsilon;
        large_double += epsilon;
        small_float += epsilon;
        small_double += epsilon;
        epsilon /= 2;        
      }
    
      return 0;
    }
    

    运行此程序会产生以下输出:

    large_float      large_double    small_float     small_double    epsilon
    1048576.000000   1048576.000000  1.000000        1.000000        0.100000
    1048576.125000   1048576.100000  1.100000        1.100000        0.050000
    1048576.125000   1048576.150000  1.150000        1.150000        0.025000
    1048576.125000   1048576.175000  1.175000        1.175000        0.012500
    1048576.125000   1048576.187500  1.187500        1.187500        0.006250
    1048576.125000   1048576.193750  1.193750        1.193750        0.003125
    1048576.125000   1048576.196875  1.196875        1.196875        0.001563
    1048576.125000   1048576.198438  1.198437        1.198438        0.000781
    1048576.125000   1048576.199219  1.199219        1.199219        0.000391
    1048576.125000   1048576.199609  1.199609        1.199609        0.000195
    

    如您所见,large_float 的值不如small_float 精确,这也会导致最终结果的准确性降低。

    【讨论】:

      猜你喜欢
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 2017-09-23
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多