gpt4 book ai didi

haskell - 如何找到负整数的立方根,使其不返回 NaN?

转载 作者:行者123 更新时间:2023-12-04 23:38:41 25 4
gpt4 key购买 nike

在 Haskell 中,我试图找到负整数的立方根,例如 -1,但没有成功。

我使用了 (-1) ** (1/3),但这会返回 NaN。我认为这可能与 (1/3) 分数的类型有关,但使用 (1/3::Double) 也没有成功。

因此,我的问题是如何使用 Haskell 找到 -1 的立方根,使其不返回 NaN?

最佳答案

对于实数,Haskell 运算符 (**)仅在指数(右侧)为整数值时为负底(左侧)值定义。如果这让您觉得奇怪,请注意 C 函数 pow行为方式相同:

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

Python 的 ** 也是如此运算符(operator):
print((-1.0)**(1.0/3.0)) 
# gives: ValueError: negative number cannot be raised to fractional power

这个问题部分是一个数学问题。将负基数提高到非整数幂的“正确答案”远非显而易见。例如,请参阅此 question on the Mathematics SO .

如果您只需要一个可以处理负数的立方根,那么给出的其他答案应该可以正常工作,只是@Istvan 的答案应该使用 signum而不是 sign , 像这样:
cbrt x = signum x * abs x ** (1/3)

如果你想要一个更一般的实数积分根函数,请注意偶数 n ,负数没有 n 次方根是实数,所以这是你能做的最好的事情:
-- | Calculate nth root of b
root :: (Integral n, RealFloat b) => n -> b -> b
root n b | odd n && b < 0 = - abs b ** overn
| otherwise = b ** overn
where overn = 1 / fromIntegral n

这给出:
> root 3 (-8)
-2.0
> root 4 (-8)
NaN -- correct, as no real root exists
>

关于haskell - 如何找到负整数的立方根,使其不返回 NaN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46264929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com