ハスケルで、私は成功していない-1などの負の整数の立方根を見つけようとしました。NaNを返さないような負の整数の立方根を見つけるには?
私は(-1)**(1/3)を使用しましたが、これはNaNを返します。私はこれが(1/3)分数の型と関係するかもしれないと思ったが、(1/3 :: Double)を使うと成功しなかった。
私の質問は、NaNを返さないように、Haskellを使って-1の立方根を見つける方法です。
ハスケルで、私は成功していない-1などの負の整数の立方根を見つけようとしました。NaNを返さないような負の整数の立方根を見つけるには?
私は(-1)**(1/3)を使用しましたが、これはNaNを返します。私はこれが(1/3)分数の型と関係するかもしれないと思ったが、(1/3 :: Double)を使うと成功しなかった。
私の質問は、NaNを返さないように、Haskellを使って-1の立方根を見つける方法です。
私はHaskellのを知りませんが、あなたはこのような何か行うことができます:私はと思える何かをやったGHCiのオン 記号(x)は* ABS(X)**(1/3)
をあなたの問題を解決してください:
let cbrt x = if x < 0 then -((-x) ** (1/3)) else x ** (1/3)
シンプルなキューブ機能。
私はまだとても不足しているか、何か問題があるのなら、私に知らせてください、これは適切な解決策である場合、私は知りません勉強していたよう。実数の場合)
、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
>
参照https://wiki.haskell.org/Power_function – chepner
ハスケルとPythonの両方が(〜0.5-0.866i) 'の-1'最初の複雑なルートを返す - 私はほとんどを推測適切な複合型を使用するならば、プログラミング言語も同様です。倍精度を使用する場合、NaNは結果が実数ではないので発生します。 – chi