C 如何计算复数的绝对值,从而防止溢出
How does C++ compute the absolute value of a complex number, preventing overflow?
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
std::complex::abs
等于std::hypot
函数,这确实可以保证避免在计算的中间阶段溢出和下流。
Hypot功能上的Wikipedia页面提供了有关实现的一些见解。
我将引用伪代码,以防万一:
// 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++中显示实际值
- 'short int'持有的值溢出,但"自动"不会溢出?
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- C++中无符号字符溢出
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 整数溢出,最大值为 pow(10,19)
- 获取隐式转换溢出从无符号到已签名的警告
- 使用 strcat 获取缓冲区溢出错误
- LeetCode 1:两和 - 地址清理器:堆缓冲区溢出地址
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 线性优化目标函数中的绝对值
- C++ 对象数组堆栈溢出
- 使用提升::lexical_cast捕获溢出
- C++ Unordered_set功能中的溢出
- 自定义排序函数中的堆溢出
- C 如何计算复数的绝对值,从而防止溢出
- 有没有一种安全的方法可以在不触发溢出的情况下获得有符号整数的无符号绝对值