繁体   English   中英

大浮点数的计算精度不如小浮点数

[英]are computations with large floats less accurate then with small floats

这句话正确吗?

由于浮点数在计算机上的对数分布,因此使用大数进行的计算不太准确。

因此,这意味着以大约1的值进行计算(由于舍入误差)比例如以1e20缩放每个数字的相同计算更准确?

简短答案:

是的,该说法是正确的,较大的浮点数不如较小的浮点数精确。

细节:

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

为了更加具体,我编写了以下程序,该程序将较小的值逐渐添加到较大的浮点数和较小的浮点数上。 同样为了显示差异,我添加了一个没有舍入的双精度浮点。 但是,如果尾数更大,则双精度型也会遇到相同的问题。

#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 ,这也可能导致最终结果也不太准确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM