This question already has answers here:
Does float have a negative zero? (-0f)

(10个答案)


去年关闭。




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

-0.0 * -1
#=> 0.0

最佳答案

您可以在Ruby中为0.0浮点数分配一个负号,因为所有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

负零有一些special properties
例如:
1 / 0.0    #=> Infinity
1 / -0.0   #=> -Infinity

明确分配-并不是获取-0.0的唯一方法。您还可以通过基本算术运算获得-0.0:
-1.0 * 0 #=> -0.0

09-25 17:54