私は言いますが、数学は私の強い訴訟ではありません。私はData.Complexパッケージを使用してHow to find the cube root of a negative integer such that it does not return NaN?のためのまともな結果を得るために期待していたが、私はData.Complexパッケージは、-8 + 0i((-8):+ 0)の立方根に奇妙な結果をもたらします
*Main> ((-8):+0) ** (1/3)
1.0 :+ 1.732050807568877
ように私は-2は実部と0が虚部である(-2.0):+0
のような何かを得るために期待さないとき。しかし、結果は重大な虚偽の部分で判明します。私は、Complex
タイプのインスタンス(**)
RealFloat
のインスタンスをチェックしました。
x ** y = case (x,y) of
(_ , (0:+0)) -> 1 :+ 0
((0:+0), (exp_re:+_)) -> case compare exp_re 0 of
GT -> 0 :+ 0
LT -> inf :+ 0
EQ -> nan :+ nan
((re:+im), (exp_re:+_))
| (isInfinite re || isInfinite im) -> case compare exp_re 0 of
GT -> inf :+ 0
LT -> 0 :+ 0
EQ -> nan :+ nan
| otherwise -> exp (log x * y)
where
inf = 1/0
nan = 0/0
だから我々は、通常Complex
のexp
とlog
インスタンスがどのように見えるexp (log x * y)
部分を見ていなければなりません。
exp (x:+y) = expx * cos y :+ expx * sin y
where expx = exp x
log z = log (magnitude z) :+ phase z
次に、私はmagnitude
に移動しました。
magnitude :: (RealFloat a) => Complex a -> a
magnitude (x:+y) = scaleFloat k
(sqrt (sqr (scaleFloat mk x) + sqr (scaleFloat mk y)))
where k = max (exponent x) (exponent y)
mk = - k
sqr z = z * z
私はスタックしています。私はちょうどsqrt (realPart z^2 + imagPart z^2)
のようにします。
何が間違っていますか?あなたはそれを3乗で見ることができるよう
複素数を扱うときにどのような根をとるかは重要な問題ではありません。あなたはおそらくプリンシパルルートを取得します。問題をよりよく理解するためにWikipediaをチェックしてください。彼らは実際に(-8)^(1/3)の例を持っています。 https://en.m.wikipedia.org/wiki/Nth_root – LudvigH
...しかし、あなたの問題の迅速な解決策は、正の数の正規のライブラリの周りにラッパーを書くことです。負の数 – LudvigH