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

标签 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;
}

我是不是漏掉了什么?同一个值怎么可能返回不同的答案呢?

最佳答案

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/

相关文章:

c - 如果字符不等于则简单

c - 将二维数组传递给c中的函数

检查两个数组是否相等 - C

javascript - 将数字向下舍入为 1

java - 100.000 个 vector 的高效比较

python - 如何构造解压缩以空字符结尾的字符串?

javascript - 无法调用函数,因为 $rootScope 未定义

c - 定义接受 short int 而不是 int 的函数的好处

使用具有标准偏差的 GROUP BY 的 SQL 查询?

iPhone Cocoa 混合模式数学基本错误