红宝石在数值精确性方面的行为(方案比较)

时间:2011-12-01 06:53:55

标签: ruby lisp scheme

在Ruby(1.9)中,数字总是被认为是确切的吗?我知道Ruby做了一些相当复杂的事情,因为你可以做一些疯狂的事情,比如要求1万亿到1万亿的力量,你会得到一个答案(在等待多个卫星计算之后)。

在Scheme中,规范的一部分规定实现应该指示实现的数字的内部表示是否“精确”。例如,1/2总是精确的,1/3是精确的,0.3333是精确的等等。但是对精确数字的不精确数学运算的结果可能产生一个Scheme实现知道不精确的数字(由于浮动点精度)。

(exact? (/ 0.33333 2))
=> #f

这是假的,所以不准确。

有没有办法在Ruby中推断出相同的信息?如果我总是在数学运算期间使用数字的Complex(或Rational)表示,那么它总是在Ruby中是否完全正确,或者只是非常接近精确?

Complex("0.33333") / 2

这是否确切?

1 个答案:

答案 0 :(得分:5)

Ruby的班级Floatnot exact。另一方面,班级Integer或多或少“是”,因为它从Fixnum无缝转换为Bignum

>> 1.4534346345235236346363574564356435
=> 1.45343463452352
>> 10**400
=> 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
>> 10.0**400
=> Infinity

看起来其他人会喜欢看到您要问的测试,即Numeric#exact? - 请参阅此feature request