为什么 C++ 中的 pow() Return 是一个负数

Why does pow() in C++ Return a Negative Number

使用 <cmath> 库中的 pow(),我得到了一些数字的负数。

2601*((int)pow(10.0,3*2)) = -1693967296

为什么会这样?是因为 int 的范围只有 -32767 到 32767 吗?还是因为选角?

不是pow(),但你抢占了答案。

10的6次方是一百万,一百万乘以2601是

2,601,000,000

对于您平台上的有符号整数,范围可能是

–2,147,483,648 to 2,147,483,647

所以你看,你已经超出了那个范围。实际的溢出差异可能看起来不一致,但那是因为补码形式。

您的程序的行为是未定义,因为您正在溢出有符号整数类型。

pow(10.0, 3 * 2) 不是 return 负数。该特定重载将 return 一个 double。您正在将其转换为一个 int,然后将其乘以一个常数。这太大了,无法放入 int。您是否检查了您平台上的 INT_MAX(或等效的 std::numeric_limits<int>::max())?

因为整数溢出

2601*1000000 > INT_MAX. 

因此溢出。

是的,这是因为int数据类型。 int范围是从-2,147,483,648到2,147,483,647,因为sizeof(int)是4个字节。

为了克服这个问题,您可以使用 unsigned intlong int

您的平台似乎有一个 32 位 int。这支持 -2147483648 到 2147483647

的范围

pow() returns 双精度浮点数中的正数。这个位工作正常。

您的演员表将其转换为 int,同样没问题。

出问题的地方是乘法。乘法溢出,有符号溢出是未定义的行为。

在你的情况下,你似乎已经结束了二进制补码环绕,但你应该知道这种行为是不保证的,特别是对于现代优化编译器。