我在 exp 中遇到运行时溢出错误,因为它超出了 64 位的限制,并且我无法使用 np.float128(),因为我使用的是 64 位 Windows 计算机。
我可以剪辑并使用它,但是如何剪辑一个复数并仍然获得虚数和复数部分。
当前代码:
import numpy as np
x = 738.368295193386-738.368295193386j
x = np.clip(x, -709.78, 709.78)
print(np.exp(x))
输出是这样的:
(1.7928227943945157e+308+0j)
但也希望虚数项有一个值。
例如:
np.exp(708.368295193386+708.368295193386j)
是(-2.657182604727012e+306-4.3615140206566584e+307j)
如何通过保留值和符号 (+ -) 获得类似的结果?
最佳答案
虽然限制值的策略适用于实数,但对于复数来说却有缺陷。事实上,复指数在复空间中执行一种旋转(请参阅 similarity ),这会导致实部/虚部的符号仅发生很小的变化。幸运的是,您可以使用模数来减少虚部,并使用钳位来使实部饱和。该策略的数值稳定性明显更高。您还可以使用 np.real
和 np.imag
提取实部/虚部。这是一个例子:
x = np.fmod(np.imag(x), 2*np.pi)*1j + np.clip(np.real(x), -709.78, 709.78)
虚部位于]-2π;2π[
范围内。它不能被钳位,因为它会强烈影响指数的结果(包括符号)。
如果这还不够,您可以计算实部的指数,然后使用 np.cos
和 np.sin
在复空间中自行旋转结果.
关于python-3.x - 裁剪复数以解决 exp 中的溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73704720/