gpt4 book ai didi

python - Haskell 和 Python 中复数实现的区别

转载 作者:行者123 更新时间:2023-11-28 19:42:20 24 4
gpt4 key购买 nike

我试图将 Python 中的复数功能映射到 Haskell 中的 Data.Complex,但我已经达到了它们不同的程度,我不确定为什么。

在 python 中:

>>> x = 3j
3j
>>> x.real
0.0
>>> x.imag
3.0

在 Haskell 中:

> import Data.Complex
> let j n = 0 :+ n
> let x = j 3.0
> realPart x
0.0
> imagPart x
3.0

到目前为止,它们看起来是一样的。看起来对它们的操作也没有太大区别:

python :

>>> y = 1 + x
(1+3j)
>>> y.real
1.0
>>> y.imag
3.0

haskell :

> let y = 1 + x
> realPart y
1.0
> imagPart y
3.0

在孤立的情况下,+ - */** 似乎都以相同的方式工作。然而,此操作会产生两种不同的结果:

>>> z = (y - 1) ** 2
(-9+0j)
>>> z.real
-9.0
>>> z.imag
0.0

但是在 Haskell 中:

> let z = (y - 1) ** 2
> realPart z
-9.000000000000002
> imagPart z
1.1021821192326181e-15

这是为什么?

最佳答案

在 Haskell 中,(**) 对于 Complex 本质上是

a ** b = exp (b * log a)

它有很多机会出现错误的舍入错误。(我对 Python 的了解还不够多,无法检查它会用类似的 log-then-exp 表达式做什么;我试过的东西提示说它还没有准备好处理 log(3j)。)它有很多特殊情况来阻止舍入错误,但没有检查完全实数的整数指数。您可能会认为这是一个错误或不当之处,并将其报告给负责 Complex 类型的人员,作为另一个值得添加到 (**) 实现中的特殊情况。

与此同时,如果您知道指数是整数,则可以使用 (^)(仅适用于正数)或 (^^) 代替:

Data.Complex> (0 :+ 3) ^ 2
(-9.0) :+ 0.0

关于python - Haskell 和 Python 中复数实现的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48100794/

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