gpt4 book ai didi

c++ - C++如何计算复数的绝对值,防止溢出?

转载 作者:太空狗 更新时间:2023-10-29 21:36:16 26 4
gpt4 key购买 nike

C++ 头文件 <complex>提供 abs(z)norm(z) .

复数 z=x+iy 的范数是 norm(z) :=x^2+y^2.

z的绝对值为abs(z) :=sqrt(范数(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

最佳答案

std::complex::abs 等同于std::hypot 函数,确实可以保证在计算的中间阶段避免上溢和下溢。

Wikipedia page on Hypot function给出了一些关于实现的见解。

我会引用伪代码以防万一:

  // hypot for (x, y) != (0, 0)
double hypot(double x,double y)
{
double t;
x = abs(x);
y = abs(y);
t = min(x,y);
x = max(x,y);
t = t/x;
return x*sqrt(1+t*t);
}

关于c++ - C++如何计算复数的绝对值,防止溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41064520/

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