из 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, как я должен получить?
edit : обратите внимание, что я не имею в виду, как получить -2 только в этом случае, но как вообще работать с рациональными числами, чтобы определить, что представление комплексного числа необходимо и переключите контекст соответствующим образом.
edit # 2 (благодаря pst и Mat) : согласно примеру с pst:
>> (Rational(-8) ** Rational(1,3)) ** Rational(3)
=> (-8.0+3.1086244689504383e-15i)
Это отличный пример того, почему я хочу вернуть Реальный ответ, когда это возможно (я был бы гораздо более снисходительным, если бы это был класс Complex
, разбрасывающий комплексные числа, но это класс Rational
- I ' Я позволю себе сказать, что он должен вести себя (). Ответ Мата иллюстрирует, почему кто-то может захотеть общего решения, такого как обезьяна-исправление для Rationals (или сложного класса и т. Д.) Или класса-оболочки: потому что в противном случае я не могу лениво писать свой код, обрабатывая основные математические операции с относительной точностью. *
Мне кажется, я вижу корни ответа в ответе Мата, но мне не сразу понятно, как преобразовать его в класс обезьяны или класс-обертку, который будет вести себя должным образом в общем коде.