我想知道数字错误发生在哪一层,这里举个例子来解释:
int p = pow(5, 3);
printf("%d", p);
我在不同的硬件和编译器 (VS 和 GCC) 上测试了这段代码,有些打印出124,有些打印出125。
- 在相同的硬件(操作系统)上,在不同的编译器(VS 和 GCC)中得到不同的结果。
- 在不同的硬件(操作系统)上,在相同的编译器(cc (GCC) 4.8.1)中得到不同的结果。
据我所知,pow 得出的结果是 124.99999999,因此被截断为 int 类型,但是这个错误是在哪里发生的?换句话说,更正是在哪里发生的 (124.99->125)?
这是编译器-硬件交互引起的吗?
//****** 编辑:
这里有一段额外的代码片段可供测试 (注意 p=5、p=18 等):
#include <stdio.h>
#include <math.h>
int main(void) {
int p;
for (p = 1; p < 20; p++) {
printf("\n%d %d %f %f", (int) pow(p, 3), (int) exp(3 * log(p)), pow(p, 3), exp(3 * log(p)));
}
return 0;
}
int
?为什么要使用具有整数指数的pow
函数?这些才是真正需要问的问题。 - David Heffernan