-1 の平方根は exp(i phase/2) として計算され、(-1 の) 位相は約π です。実際には、
>>> import cmath, math
>>> z = -1+0j
>>> cmath.phase(z)
3.141592653589793
>>> math.cos(_/2)
6.123233995736766e-17
これは、-1 の位相が 1e-17 の数までだけ π であることを示しています。位相を 2 で割った値も約 π/2 にすぎず、そのコサインは約 0 にすぎないため、結果が得られます (結果の実部はこのコサインです)。
問題は、固定された有限数の浮動小数点数しかないという事実から最終的に生じます。数値 π は浮動小数点数のリストにないため、近似的にしか表現できません。π/2 も正確に表すことができないため、-1 の平方根の実部は π/2 の浮動小数点近似のコサインです (したがって、0 とは異なるコサイン)。
したがって、Python の近似値numpy.power(complex(-1), .5)
は、最終的には浮動小数点数の制限によるものであり、多くの言語で見られる可能性があります。
あなたが観察したことは、数の累乗の実装を通じて、この浮動小数点の制限に関連しています。あなたの例では、平方根は、モジュールと複素数の引数を評価することによって計算されます(基本的に、log(module)+ iフェーズを返すlog関数を介して)。一方、異なる方法を使用し、 (TonyK が示唆するように)の浮動小数点近似の問題に悩まされていないため、cmath.sqrt(-1)
正確に与えられます。1j
(-1+0j)**0.5