我的程序打印传递给函数的值的自然对数。我观察到的奇怪的事情是,当我将值 0.1 分配给我的虚拟变量并将其作为参数传递时,我的函数返回一个错误的答案,而如果我直接传递实际值 0.1,我得到正确的答案。
#include <stdio.h>
double pow(double val, int x) {
int i;
for(i = 1; i <= x; i++) {
val *= val;
}
return val;
}
double log(double val) {
int i;
int n = 20;
double ret_val;
for(i = 1; i < n; i++) {
ret_val += pow(-1,i+1) * pow(val-1,i);
}
return ret_val;
}
int main() {
double dummy;
dummy = 0.1;
printf("%f",log(dummy));
printf("%f",log(0.1));
return 0;
}
我是不是漏掉了什么?同一个值怎么可能返回不同的答案呢?
最佳答案
double ret_val;
在您的函数 log()
中使用未初始化,调用未定义的行为。
但我认为问题在于,在第二种情况下,标准头文件 math.h
提供了 log()
函数,而这就是被执行的函数(因此您会看到正确的结果)。
错误的结果来自您的函数,它具有未初始化的值。
将您的功能更改为:
double mylog(double val) {
printf("Executed\n");
...
}
你应该得到:
prog.c:3:8: warning: conflicting types for built-in function 'pow' [-Wbuiltin-declaration-mismatch]
double pow(double val, int x) {
^~~
Executed
2.117386
-2.302585
现在人们应该认为 math.h
没有包含在您的代码中,但是一些编译器倾向于包含他们认为需要的 header ,我认为这就是您的情况。
避免这些讨厌情况的一个好主意是避免使用内置函数名称。
关于c - 作为变量和值传递的参数,都返回不同的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46292393/