小编Jos*_*old的帖子

需要计算双精度浮点数的复数对数

我尝试使用以下方法计算 clog(a + i*b) 的实部

将“x”视为复数。x = a + i*b 令 z 为 x 的复数对数。

实数(x) = 0.5 * log(a^2 + b^2)

这种方法在 ULP 方面会产生巨大的误差,特别是对于 0.5 和 1.0 之间的值。

我尝试了其他方法来避免实部和虚部的平方,例如

设 t = b / a;实数(x) = log(a) + 0.5 * log1p(t*t)

使用此方法时错误仍然存​​在。我知道错误可能来自 a 和 b 的平方,因此我尝试使用fma()操作来获取由于 'a' 和 'b' 的平方引起的错误

令 a2 = a * a b2 = b * b

err_a2 = fma(a,a, -a2)

err_b2 = fma(b,b,-b2)

然后我尝试0.5 * log(((err_a1 + err_b2) + a2) + …

c c++ math floating-point complex-numbers

3
推荐指数
2
解决办法
362
查看次数

标签 统计

c ×1

c++ ×1

complex-numbers ×1

floating-point ×1

math ×1