作者: 機械伯爵
日時: 2009/8/15(01:21)
 それにしても「一行で解の公式」って、誰か書いていそうなモノだと思った
んですけどね……検索したら(少なくとも)日本語では見つからなかったなぁ。

 機械です。

> >  でも、素の計算でまがいなりにも-1**0.5が出来るのに、
> > math.sqrt(-1)のほうがきっちり領域(domain)を守ってるってのも、
> > 不思議な感じがしますけどね……いや、それが正しいのか……
> まずlong(長整数)とfloat(浮動小数点数)とcomplex(虚数と書くのは
> 気持ち悪いので複素数)では当然ながら処理がまったく違いました。
> 
> で、今回に関わるfloatでは、a**b においてaが負の数かつbが整数で
> なければcomplexにまかせています。これ以外は標準関数のpow()を使用。

 組み込み(標準)関数のpowでも

>>> pow(-1,0.5)+1-1
1j
>>>

 とかやってるので、powの中身でも分別してるんでしょうね(違うのかな?)

※a ** bはpow(a, b)の構文糖衣だと思ってたんですが。
 
 で、実数解以外は複素数オブジェクトに渡し、ですか。

> complexでは、bが整数以外であればオイラーの公式を由来とするexp()や
> 三角関数を利用した方法で計算しています。b==0 などの特別な処理も
> ありますが、今回は関係ないので省略。

 math.exp(x)は、math.e ** x ですね(若干ズレますが)
 
> 一方、cmath.sqrt では二次元の連立方程式で解くやりかたをしていました。

 手間はかかるが、精度は高い、と。

> というわけで違いが出る理由は解明できました。
> 私の感想はスクリプト通信の次号の内容にかかわるかもしれないため、
> 自制ということで…。

 えっと、一応初心者講座なんで、内包記法の裏ワザをバリバリにつかった
式は、欄外にしか出てきませんよ。

※モジュールインポートせずに解の公式を解く関数は書きましたから、
 1/2乗は出てきますけど。

 /機械伯爵/