为什么C ++中的pow()返回一个负数

时间:2016-09-22 07:25:57

标签: c++ pow cmath

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

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

为什么会这样?是因为int只有-32767到32767之间的范围?或者是因为演员?

5 个答案:

答案 0 :(得分:5)

当您溢出有符号整数类型时,程序的行为未定义

userDetailsFactory 返回负数。该特定重载将返回pow(10.0, 3 * 2)。您将其转换为int然后将其乘以常量。这太大了,不适合double。您是否在平台上查看了int(或同等的INT_MAX)?

答案 1 :(得分:2)

这不是pow(),但是你先发了答案。

10到6的功率是一百万,而一百万次是2,601是

2,601,000,000

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

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

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

答案 2 :(得分:2)

这是因为整数溢出。

2601*1000000 > INT_MAX. 

因此溢出。

答案 3 :(得分:0)

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

要解决此问题,您可以使用 unsigned int long int

答案 4 :(得分:0)

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

pow()在双精度浮点数中返回一个正数。这个位工作正常。

你的演员将其转换为int,再次没问题。

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

在你的情况下,你似乎已经完成了二次补充,但是你应该意识到这种行为并不是很好的,特别是对于现代优化编译器。