我的程序打印传递给函数的值的自然对数。我观察到的奇怪的事情是,当我将值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;
}
我在这里遗漏了什么吗?相同的值如何能够返回不同的答案?
答案 0 :(得分:2)
double ret_val;
在您的函数log()
中使用未初始化,并调用未定义的行为。
但我认为问题在于,在第二种情况下,标准标题math.h
提供了log()
函数,而这是执行的函数(因此您可以看到正确的结果)。 / p>
错误的结果来自你的函数,它具有未初始化的值。
将您的功能更改为:
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
,但是某些编译器倾向于包含他们认为需要的头文件,我认为这就是你的情况。
避免这些令人讨厌的情况的好主意是避免使用内置函数名称。
答案 1 :(得分:1)
在学习并解决所有出现的警告时,始终使用log
进行编译。这将直接避免val^x
中未初始化的返回值。
您的权力函数将根据名称建议不计算val^(2^(max(0,x)))
,但val *= val;
为行
val
始终计算x
的最近值的平方,因此您执行输入变量的~/api/default/newsitems?$expand={related-data-field}&$filter={related-data-field}/any(c: c/Id eq 888ac18a-85c0-4259-9a3c-05f25e53b23e)
方形。