为什么 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 int 或 long int
您的平台似乎有一个 32 位 int。这支持 -2147483648 到 2147483647
的范围
pow() returns 双精度浮点数中的正数。这个位工作正常。
您的演员表将其转换为 int,同样没问题。
出问题的地方是乘法。乘法溢出,有符号溢出是未定义的行为。
在你的情况下,你似乎已经结束了二进制补码环绕,但你应该知道这种行为是不保证的,特别是对于现代优化编译器。
使用 <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 int 或 long int
您的平台似乎有一个 32 位 int。这支持 -2147483648 到 2147483647
的范围pow() returns 双精度浮点数中的正数。这个位工作正常。
您的演员表将其转换为 int,同样没问题。
出问题的地方是乘法。乘法溢出,有符号溢出是未定义的行为。
在你的情况下,你似乎已经结束了二进制补码环绕,但你应该知道这种行为是不保证的,特别是对于现代优化编译器。