作为变量和值传递的参数都返回不同的答案

时间:2017-09-19 05:21:25

标签: c function math floating-point

我的程序打印传递给函数的值的自然对数。我观察到的奇怪的事情是,当我将值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;
}

我在这里遗漏了什么吗?相同的值如何能够返回不同的答案?

2 个答案:

答案 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) 方形。