这个打印 100:
int j=2;
int i= pow(10,2);
printf("%d\n", i);
这个打印 99:
int j=2;
int i= pow(10,j);
printf("%d\n", i);
为什么?
这个打印 100:
int j=2;
int i= pow(10,2);
printf("%d\n", i);
这个打印 99:
int j=2;
int i= pow(10,j);
printf("%d\n", i);
为什么?
发生的情况是,您有一个 C 实现,其标准库的实现质量非常低pow
,即使准确的结果可以用类型 ( double
) 表示,它也会返回不精确的结果。调用pow(10,2)
似乎产生了下面的值100.0
,当四舍五入为整数时,产生 99。当参数为常量时你看不到这一点的原因是编译器冒昧地一起优化调用并替换它在编译时为常数 100。
如果您的意图是进行整数幂,请不要使用该pow
函数。写一个适当的整数幂函数,或者当指数已知时,直接写出乘法。
在第一种情况下,我怀疑编译器在10*10
没有实际调用的情况下优化了值pow
(编译器确实这样做了)。在第二种情况下,看起来您有浮点舍入错误。结果几乎是100,但不完全是,隐式转换会int
截断它。
该pow
函数在 上运行double
,而不是int
。
通常(但并非总是如此),当您将双精度数转换为整数时,您调用round()
. 例如:
int i = (int) round(pow(10,j));
如果你的 C 库没有这个,你可以模拟:
#define round(x) floor((x)+0.5)