为什么我们在Ruby中有0.0和-0.0?




floating-point negative-zero (3)

在ruby中,为什么我可以给负0.0浮点数分配一个负号,此功能有任何用处吗? 有人可以向我解释这个吗?

-0.0
#=> -0.0

-0.0 * -1
#=> 0.0

一个可能需要-0.0的示例是使用正切极,正割或正割等函数的函数,该函数具有需要沿正确方向的垂直极点。 您可能最终进行划分以获得负无穷大,并且您不希望将其绘制为一条垂直线,直至达到正无穷大。 或者您可能需要一个函数的正确符号,该符号从下方渐近接近0,例如您是否具有负数的指数衰减并检查其是否为负。


它不是Ruby的功能,而是浮点数规范的一部分。 看到 这个答案 。 负零等于正零:

-0.0 == 0.0
# => true

这是因为所有 IEEE 754 浮点数都有一个 符号位 来指示数字是正数还是负数。

这是 2.5-2.5 的二进制表示形式:

[2.5].pack('f').unpack1('b*')
#=> "00000000000000000000010000000010"

[-2.5].pack('f').unpack1('b*')
#=> "00000000000000000000010000000011"

最后一位是符号位,请注意所有其他位都相同。

另一方面,符号位设置为 0

['00000000000000000000000000000000'].pack('b*').unpack1('f')
#=> 0.0

零,符号位设置为 1

['00000000000000000000000000000001'].pack('b*').unpack1('f')
#=> -0.0

尽管 0.0-0.0 在数值上相等,但是它们在对象级别上并不相同:

(0.0).eql?(-0.0)   #=> true
(0.0).equal?(-0.0) #=> false

使用负零时有一些 特殊的属性 ,例如:

1 / 0.0    #=> Infinity
1 / -0.0   #=> -Infinity

显式分配不是获取 -0.0 的唯一方法。 您也可以通过基本算术运算得到它:

-1.0 * 0 #=> -0.0




negative-zero