【发布时间】:2013-10-01 22:06:30
【问题描述】:
这个打印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);
为什么?
【问题讨论】:
-
你使用的是什么编译器,在什么系统上?
-
我猜这是双精度结果的整数截断,看看
"%f"的输出是什么样子会很有趣。 -
@MSalters:不,这绝对是 MS 的错,或者更确切地说是 mingw 使用有缺陷的 MS 代码的错。 Mingw 是使用 GCC 作为编译器和 MSVCRT.DLL(微软的 libc)作为标准库的 C 实现。越野车
pow是后者的一部分。 -
@MSalters:如前所述,它可能符合要求,但即便如此,它的实施质量也极低。没有理由让函数为参数返回错误的结果,其中正确的结果完全可以表示并且可以正确计算。编译器的优化选择解释了差异,但如果库版本返回正确的结果,就不会有任何差异。
-
@MSalters:正如严格不等式所述,该属性不可能通过简单的计数参数来满足;唯一可能的方法是
pow(x,y)==x对于所有 x,y。如果您将其修复为使用<=而不是<,那么任何正确处理精确结果的理智实现都将满足您的(修改后的)条件。
标签: c floating-point pow