作者: Zazel
日時: 2009/8/13(23:44)
Zazelです。

=== kikwai@... (機械伯爵) さんが書かれた
=== <20090813133733.07E441000004@...> にて

>> >>> sol = lambda a,b,c:[(-b+k*(b*b-4*a*c)**(1/2))/(2*a) for k in (1,-1)]
>> >>> sol(1,2,3)
>> [(-0.9999999999999999+1.4142135623730951j), (-1-1.4142135623730951j)]

これを

>>> import cmath
>>> sol = lambda a,b,c:[(-b+k*cmath.sqrt(b*b-4*a*c))/(2*a) for k in (1,-1)]
>>> sol(1,2,3)
[(-1+1.4142135623730951j), (-1-1.4142135623730951j)]

にすると問題ないところがあれですね。

>  実は次号掲載予定の「やnPy」のおまけにも書いたのだけど、複素数/虚数
> に関して、どーもおかしな挙動をするみたいです(以下、Python 3.1 for Win)

おかしな挙動というか手抜きなんじゃないかと思っています。

普通に複素数でべき算を計算しようとすればオイラーの公式を使うと
思うので、それで誤差が現れるのではないかとの考えに至りました。
虚部だけの複素数だったら、一時的に虚数をはずして実数のべき乗の
アルゴリズムを使えばいいのに、それをしていないのではないかとね。

というわけで、cmath.pow がないのが変ということで。(^_^;)

(* SEKI Masatoshi  /  zazel.ts@..."cx"           *)
(*  Would you hold my hand? Softly, let's linger. *)