关于C ++中的pow函数

时间:2017-01-13 03:18:33

标签: c++

我刚试了三段代码:

#include<cstdio>
#include<cmath>
#include<cstring>
int main()
{
    int a = 3;
    int b = pow(10,a);
    printf("%d",b);
    return 0;
}
//Output:1000

#include<cstdio>
#include<cmath>
#include<cstring>
int main()
{
    int a = 3;
    int b = pow(10,a-1);
    printf("%d",b);
    return 0;
}
//Output:99

#include<cstdio>
#include<cmath>
#include<cstring>
int main()
{
    int a = 3;
    int b = pow(10,a-2);
    printf("%d",b);
    return 0;
}
//Output:10

我想知道为什么第二个代码块会输出99,是不是因为浮点精度?或者是因为我应该在pow函数中使用浮点数?(例如10.0) 我常常对C ++的准确性感到困惑,我将非常感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

通过截断将浮点值转换为整数 - 您将获得接近零的下一个整数。如果pow不精确且太低,那么截断会加剧它。

lround(pow(10,2))可能更合适。

答案 1 :(得分:0)

对于整数指数,以下模板非常方便:

template <typename T> inline constexpr T pow( T base, int exponent )
{
    return (exponent == 0) ? static_cast<T>(1.0) : ( (exponent>0) ? base*pow(base, exponent-1) : pow( static_cast<T>(1.0)/base, -exponent ) );
}

如果您计划在C ++ 11之前使用C ++标准,只需删除constexpr关键字。