【发布时间】:2016-12-09 16:12:08
【问题描述】:
C++ 标头<complex> 提供abs(z) 和norm(z)。
复数z=x+iy的范数是norm(z):=x^2+y^2。
z 的绝对值是abs(z):=sqrt(norm(z))。
但是,下面的示例显示abs(z) 必须以不同的方式实现,因为尽管norm(z) 会溢出,但它不会溢出。至少在g++ 6.2.1下不会溢出。
标准是否保证了这种不溢出?它是如何实现的?
#include <iostream>
#include <complex>
typedef std::complex<double> complex_t;
int main()
{
complex_t z = { 3e200, 4e200 };
double a = abs(z);
double n = norm(z);
std::cout << a << " -> " << std::isinf(a) << "\n";
std::cout << n << " -> " << std::isinf(n) << "\n";
return 0;
}
输出:
5e+200 -> 0
inf -> 1
【问题讨论】:
-
看头文件中的实现。至少在我的系统上,abs(real part), abs(imag part) 的最大值用于先除,然后乘。这可能是避免溢出的原因。
标签: c++ numeric floating-accuracy complex-numbers