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

ruby在数值精确性方面的行为(方案比较),ruby,lisp,scheme,Ruby,Lisp,Scheme,在Ruby(1.9)中,数字总是被认为是精确的吗?我知道Ruby对数字做了一些相当复杂的事情,因为你可以做一些疯狂的事情,比如要求1万亿次方到1万亿次方,然后你就会得到答案(在等待了很多次卫星的计算之后) 在Scheme中,规范的一部分规定,实现应该指示实现对数字的内部表示是否“精确”。例如,1/2始终是精确的,1/3是精确的,0.3333是精确的等等。但对精确数字进行不精确数学运算的结果可能会产生方案实现知道不精确的数字(由于浮点精度) 那是假的,所以不准确 有没有一种方法可以在Ruby中推断

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

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

那是假的,所以不准确

有没有一种方法可以在Ruby中推断出相同的信息?如果我在数学运算中总是使用一个数字的
复数
(或
有理
)表示,那么它在Ruby中总是精确的,还是非常接近精确的

Complex("0.33333") / 2

这是否准确?

Ruby的类
Float
是。另一方面,类
Integer
或多或少是“is”,因为它可以无缝地从
Fixnum
转换到
Bignum

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

看起来其他人很想看到你所问的测试,即
Numeric#exact?
——看看这个。

所以基本上,如果我确保数学运算(如除法)中的两个操作数始终是有理数或复数的实例,无论我在哪里进行需要精度的计算,我都可以保证我使用的是有理数或复数“完全正确“数字?顺便说一句,ruby中任何不是有理数、复数或Fixnum/Bignum的数字都是不精确的,即使它的值是
1.7653
,硬编码为文字?@d11wtq:您可能也感兴趣。@d11wtq如果您的值是class
Float
,它可能是精确的;例如,IEEE 754中准确地表示了2.0,但0.1不是。从理论上讲,可以查看浮点的字符串表示,并确定是否存在精确的表示,但我认为这可能很难。例如,2^-1074在IEEE 754 double中完全可以表示,但十进制字符串非常大。:)Ruby还说,Float映射到“底层硬件”(不是nec.IEEE 754)的底线:你是对的。尽量避免<代码>浮点< /代码>:考虑在引用的链接中描述的<代码> BigDecimal >代码。谢谢,尽管根据这个链接,即使在非常小的值下,二进位是不精确的,也无法真正知道该值是否真的为零,或者只是非常接近于零。BigDecimal可能返回零,因为该操作的结果太小,无法计算。我想知道Rational是否也面临同样的问题。我知道一个有理数除以一个浮点数是不精确的,但是一个有理数除以一个非常大的有理数,它的值非常接近于零,bigdecime会下降。我想你在这里可能没问题。。。在irb中键入
Rational(1,10**500)
。不确定计算将如何进行。我从来没有试过。
>> 1.4534346345235236346363574564356435
=> 1.45343463452352
>> 10**400
=> 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
>> 10.0**400
=> Infinity