来自 http://www.ruby-doc.org/core/classes/Rational.html
Rational(10) / 3 #=> (10/3)
Rational(10) / 3.0 #=> 3.3333333333333335
Rational(-8) ** Rational(1, 3)
#=> (1.0000000000000002+1.7320508075688772i)
前两个我看得懂,但最后一个我看不懂。请注意 Rational(8) ** Rational(1, 3)
工作得很好,并且没有浮点上下文来搅浑水。谁能给我解释一下,以及如何像我应该得到的那样得到 -2?
编辑:请注意,我的意思不是仅在这种情况下如何获得 -2,而是通常如何使用有理数检测复数表示是必要并适本地切换上下文。
编辑 #2(感谢 pst 和 Mat):按照 pst 的例子:
>> (Rational(-8) ** Rational(1,3)) ** Rational(3)
=> (-8.0+3.1086244689504383e-15i)
这是一个很好的例子,说明了为什么我会尽可能返回一个真实的答案(如果这是 Complex
类吐出复数,我会更宽容,但这是 Rational
类 — 我敢说它的行为应该理性)。 Mat 的回答说明了为什么人们可能需要一个通用的解决方案,例如 Rationals(或复杂类等)的猴子补丁或包装类:因为否则我无法通过相对精确地处理基本数学运算来懒惰地编写代码。
我想我在 Mat 的回复中看到了答案的根源,但我并不清楚如何将其转换为在通用代码中表现正常的猴子补丁或包装类。
最佳答案
答案不是 糟糕,数学不及格。无论如何,其余的部分在某种程度上仍然是相关的。请参阅 Mat 的评论和 Sawa 的回答。-2
:答案是2i
.
这并不能解释为什么不只有一个漂亮的 请参阅 Sawa 的回答以了解如何“理解”结果返回的复数。2i
(或 (0+2i)
)在输出中,我怀疑这只是由于内部舍入错误(它不会尝试替换 matlab)。
参见 Imaginary Numbers和 Complex Numbers对于结果中使用的符号。
考虑:
>> (Rational(-8) ** Rational(1,3)) ** Rational(3)
=> (-8.0+3.1086244689504383e-15i)
那不远了!
但是,
>> (Rational(8) ** Rational(1,3)) ** Rational(3)
=> 8.0
是“完美的”。希望有人可以运行它。
快乐编码。
编辑,好的,这是发生的事情:Rational ** Rational
的结果不是有理数。
当结果为真时Rational ** Rational -> Float
, 但当结果包含虚部时,则 Rational ** Ration -> Complex
.
在“完美”的情况下,我们只是保持在 Float 精度的范围内(至少足以获得“漂亮的结果”)。在生成 Complex 对象的情况下,由于存储在实部 + 虚部中,然后稍后对数据执行数学运算,因此组合组件的相对精度 Float 的界限不够好。
关于ruby - 理解 ruby 有理数中的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5922623/