加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

理解ruby理性中的数字

发布时间:2020-12-17 02:41:36 所属栏目:百科 来源:网络整理
导读:从 http://www.ruby-doc.org/core/classes/Rational.html Rational(10) / 3 #= (10/3)Rational(10) / 3.0 #= 3.3333333333333335Rational(-8) ** Rational(1,3) #= (1.0000000000000002+1.7320508075688772i) 我理解前两个,但不是最后一个.请注意,Rational(8
从 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)

这是一个很好的例子,说明为什么我会尽可能地回复一个真正的答案(如果这是复杂的类会吐出复杂的数字,我会更宽容,但这是Rational类 – 我敢说这个它应该是合理的行为). Mat的答案说明了为什么人们可能想要一个通用的解决方案,比如Rationals(或复杂的类等)的猴子补丁或者包装类:因为否则我不能通过相对精确的方式处理基本的数学运算.

我认为我在Mat的响应中看到了答案的根源,但是我不能立即明白如何将其转换为在通用代码中表现正常的猴子补丁或包装类.

解决方法

答案不是-2:答案是2i.哎呀,数学失败了.在任何情况下,其余部分仍然以某种方式相关.请参阅Mat的评论和Sawa的回答.

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

有关结果中使用的符号,请参见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 ** Rational – >浮点数,但是当结果包含一个虚构的组件时,那么Rational ** Ration – >复杂.

在“完美”的情况下,我们只是停留在浮点精度的范围内(至少足以获得“漂亮的结果”).在导致Complex对象的情况下,由于存储在真实的虚部中然后在数据上执行数学,因此组合组件的相对精度Float的界限不够好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读