Rational(10) / 3 #=> (10/3)Rational(10) / 3.0 #=> 3.3333333333333335Rational(-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的界限不够好.
总结以上是内存溢出为你收集整理的理解ruby理性中的数字全部内容,希望文章能够帮你解决理解ruby理性中的数字所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)