Bru*_*cho 69 ruby floating-point negative-zero
在ruby中,为什么我可以给负0.0浮点数分配一个负号,此功能有任何用处吗?有人可以向我解释这个吗?
-0.0
#=> -0.0
-0.0 * -1
#=> 0.0
Run Code Online (Sandbox Code Playgroud)
Ste*_*fan 101
您可以在Ruby中为0.0浮点数分配一个负号,因为所有IEEE 754浮点数都有一个符号位来指示该数字是正数还是负数。
下面是二进制表示2.5和-2.5:
[2.5].pack('f').unpack1('b*')
#=> "00000000000000000000010000000010"
[-2.5].pack('f').unpack1('b*')
#=> "00000000000000000000010000000011"
Run Code Online (Sandbox Code Playgroud)
最后一位是符号位。注意,所有其他位都相同。
另一方面,零为零0:
['00000000000000000000000000000000'].pack('b*').unpack1('f')
#=> 0.0
Run Code Online (Sandbox Code Playgroud)
和零,符号位为1:
['00000000000000000000000000000001'].pack('b*').unpack1('f')
#=> -0.0
Run Code Online (Sandbox Code Playgroud)
尽管0.0和-0.0在数值上相等,但是它们在对象级别上并不相同:
(0.0).eql?(-0.0) #=> true
(0.0).equal?(-0.0) #=> false
Run Code Online (Sandbox Code Playgroud)
负零有一些特殊的性质。例如:
1 / 0.0 #=> Infinity
1 / -0.0 #=> -Infinity
Run Code Online (Sandbox Code Playgroud)
-显式分配不是获得的唯一方法-0.0。您可能还会得到-0.0基本算术运算的结果:
-1.0 * 0 #=> -0.0
Run Code Online (Sandbox Code Playgroud)
hob*_*bbs 41
数学运算具有实数结果,但是我们将那些实数结果映射到最接近的浮点数,这称为“舍入”。对于每一个浮点数,有一个范围,将舍入到浮球实数,有时想到浮动的,与该范围内的实数被认定是非常有用的。
由于浮点数是有限的,因此必须有最小的正浮点数,而相反的是最小(幅值)负浮点数。但是,甚至小于那些的实数结果会怎样?好吧,它们必须“四舍五入”。但是“一个很小的数字大于零”和“一个很小的数字小于零”是完全不同的事物,它们的数学行为也有很大不同,所以为什么要舍入,而又要舍弃它们之间的区别呢?我们没有必要。
因此,浮点数0不仅包含实数0,而且还包含太小而无法表示的正数。浮点数-0太小而无法表示负数。当您在算术中使用它们时,它们遵循诸如“负数乘以正数等于负数;负数乘以负数等于正数”之类的规则。即使在舍入过程中我们几乎忘记了这些数字的所有内容,我们仍然没有忘记它们的符号。
mrz*_*asa 26
它不是Ruby的功能,而是浮点数规范的一部分。看到这个答案。负零等于正零:
-0.0 == 0.0
# => true
Run Code Online (Sandbox Code Playgroud)