在某些情况下,浮子是天花板

时间:2014-05-02 10:15:55

标签: ruby floating-point

  • 2.333333333333333333333向上舍入为2.3333333333333335
  • 1.X3333333333333333有时会向上舍入为1.X333333333333334,但有时不会。{/ li>
  • 0.X333333333333333未被四舍五入。

    1.33333333333333333333
    # => 1.3333333333333333
    1.43333333333333333333
    # => 1.4333333333333333
    1.53333333333333333333
    # => 1.5333333333333334
    1.63333333333333333333
    # => 1.6333333333333333
    1.73333333333333333333
    # => 1.7333333333333334
    1.83333333333333333333
    # => 1.8333333333333333
    1.93333333333333333333
    # => 1.9333333333333333
    

这是一个错误还是只是精确的未定义行为?

1 个答案:

答案 0 :(得分:1)

在IEEE 754浮点中,接近零的数字用更小(更好)的绝对精度表示。即使不查看the “double-precision” binary representation的详细信息,也是完全正常的,可以预料到:

  • 2.3333333333333333附近的任意数字有时只能表示在0.0000000000000002之内,
  • 12之间的数字可以表示在0.0000000000000001之内,并且
  • 01之间的数字可以表示为精度优于0.0000000000000001。

如果你看一下表示的细节,你会发现精度每次变化都是2(也就是说,对于1和2之间的所有数字都是一样的,对于2之间的所有数字都是一样的) 4和2之间的数字精度比1和2之间数字的精度差2倍。

对于1到2之间的数字,精度为1/2 52 。这是十进制0.0000000000000002220446049250313080847263336181640625。如果您选择介于1和2之间的任意数字,即使是具有简单小数表示的,您也不能指望它的精确度超过此精度的一半。

如果您在选择表示的数字中有一些余地,但希望它们完全表示为双精度IEEE 754浮点数,请不要选择具有十进制简单表示的数字但是数字很简单二进制表示。例如,这些是用十进制0.50.250.375编写的数字,......