2017-09-17 5 views
4

ハスケルで、私は成功していない-1などの負の整数の立方根を見つけようとしました。NaNを返さないような負の整数の立方根を見つけるには?

私は(-1)**(1/3)を使用しましたが、これはNaNを返します。私はこれが(1/3)分数の型と関係するかもしれないと思ったが、(1/3 :: Double)を使うと成功しなかった。

私の質問は、NaNを返さないように、Haskellを使って-1の立方根を見つける方法です。

+2

参照https://wiki.haskell.org/Power_function – chepner

+0

ハスケルとPythonの両方が(〜0.5-0.866i) 'の-1'最初の複雑なルートを返す - 私はほとんどを推測適切な複合型を使用するならば、プログラミング言語も同様です。倍精度を使用する場合、NaNは結果が実数ではないので発生します。 – chi

答えて

1

私はHaskellのを知りませんが、あなたはこのような何か行うことができます:私はと思える何かをやったGHCiのオン 記号(x)は* ABS(X)**(1/3)

1

をあなたの問題を解決してください:

let cbrt x = if x < 0 then -((-x) ** (1/3)) else x ** (1/3) 

シンプルなキューブ機能。

私はまだとても不足しているか、何か問題があるのなら、私に知らせてください、これは適切な解決策である場合、私は知りません勉強していたよう。実数の場合)

5

、Haskellのオペレータ(**)のみが定義されています指数(右辺)が整数値のときの負の基底(左辺)の値。

printf("%f\n", pow(-1.0, 1.0/3.0)); // prints "-nan", for me 

ので、Pythonの**演算子を行います:

print((-1.0)**(1.0/3.0)) 
# gives: ValueError: negative number cannot be raised to fractional power 

問題は部分的に数学的なものですが、これはあなたに奇妙に当たる場合は、C関数powが同じように振る舞うことに注意してください。負の基底を非積分力にするための「正解」は明らかではありません。例えば、question on the Mathematics SOを参照してください。あなたはだけ負の数を扱うことができる立方根が必要な場合は

は、与えられた他の回答は、@ことを除いて、正常に動作する必要がありますイシュトヴァーンの答えは次のように、signの代わりにsignumを使用する必要があります。

cbrt x = signum x * abs x ** (1/3) 

の場合実際の数値に対してより一般的な積分根関数が必要な場合でも、nの場合、n番目の実数の根は存在しないので、これはあなたが行うことができる最良のものです。

これが与える:

> root 3 (-8) 
-2.0 
> root 4 (-8) 
NaN  -- correct, as no real root exists 
> 
関連する問題