为什么我们在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