ruby - 理解 ruby 有理数中的数字

标签 ruby math

来自 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 的回复中看到了答案的根源,但我并不清楚如何将其转换为在通用代码中表现正常的猴子补丁或包装类。

最佳答案

答案不是-2 :答案是2i . 糟糕,数学不及格。无论如何,其余的部分在某种程度上仍然是相关的。请参阅 Mat 的评论和 Sawa 的回答。

这并不能解释为什么不只有一个漂亮的 2i (或 (0+2i) )在输出中,我怀疑这只是由于内部舍入错误(它不会尝试替换 matlab)。 请参阅 Sawa 的回答以了解如何“理解”结果返回的复数。

参见 Imaginary NumbersComplex 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/

相关文章:

c++ - 检查数字是否是 C++ 中的回文

ruby-on-rails - rails : form_for routes won't display a good form

ruby-on-rails - 正则表达式 "\w"不处理 Ruby 1.9.2 中的 utf-8 字符

ruby - 除了某些字符外,如何匹配 `:punct:`?

javascript - 通过随机点绘制好看的贝塞尔曲线

javascript - 解决循环组合程序问题的程序

python - 许多数组的插值的矢量化总和

ruby - 使用 Jekyll/Liquid 将 Markdown 内容传递给 Ruby 函数

ruby-on-rails - 从事件记录对象的第三个到最后一个遍历每个元素

java - 用 vector 投影找点