return value of pow() gets rounded down if assigned to an integer
我在C中使用pow函数,并将返回值存储为整数类型。 请参见下面的代码段:
1 2 3 4
| for (i = 0; i < 5; i ++){
val = (int)pow(5, i );
printf("%d,", val );
} |
这里i和val是整数,输出是1, 5, 24, 124, 624。
我相信这是因为浮点数25被视为24.99999 ...在分配给整数时会四舍五入为24。
如果仍然需要将返回值存储在int中,该如何传递呢?
-
float 25不被"视为" 24.9...,25可以精确地表示为浮点数。 只是pow并不完全准确,并且由于某种原因在这种情况下错过了低位。 对于许多值来说,它不可能完全准确,因为数学上正确的答案并不是精确的浮点数,但是对于这些计算而言,它可能是精确的,因此无论是否正确,其实现质量都是一个问题。
-
另请参阅stackoverflow.com/questions/101439/,以获取有关如何实现pow()的整数版本的讨论。
-
不要使用pow进行整数幂运算。 有更好,更安全的方法。 顺便说一句,您在什么平台上发生此行为? 我认为好的pow总是对确切的结果适合double的整数完全正确。
-
pow函数的奇怪行为的可能重复
-
为什么在我的编译器和OS中,当n = 5时pow(n,2)为什么返回24的可能重复项?
在投射到int之前添加0.5。 如果您的系统支持它,则可以调用C99 round()函数,但是出于可移植性的原因,我宁愿避免使用它。
-
略有不同,round取整为零,而加0.5并强制转换为int取整。 因此,例如round(pow(-0.5,1))为-1,而(int)(pow(-0.5,1) + 0.5)为0。因此,发问者可能需要决定他们想要哪个,尽管当然,如果答案接近整数,则没有任何区别。
-
"半圆从零开始四舍五入,而将0.5加到int会四舍五入"-对于半整数值,我的意思是。
-
@JoelSpolsky:感谢您的编辑,但是round()在所有系统上均不受支持。 我已经对您的编辑进行了相应的限定。
-
谢谢。 我不知道。
-
@乔尔:我认为你是对的。 round()是标准(C99),它仅适用于某些系统。 有时需要对C89进行编程,但是如果函数在C99中,则您所要担心的就是带有非常旧的编译器的原始系统。 Windows是最重要的示例。
-
@SteveJessop:位置很好(答案已修改)。
更换
与
1 2
| double d = pow(5,i );
val = (int)((d > 0.0) ? floor(d + 0.5) : ceil(d - 0.5)); |
自己实施战俘。
1 2 3 4 5 6 7
| int myPow(int base, int exponent) {
int n = 1;
for (int i = 0; i < exponent; i++) {
n *= base;
}
return n;
} |
当然,这仅处理正指数,并且仅在整数上起作用,并且当然有更有效的方法可以做到这一点。 例如,参见Haskell中^的来源。
我自己有这个问题。 我在您的指令中轻松解决了它,只需添加if语句即可。
1 2 3 4
| if (k%n>0)
{
k=k+1;
} |