2017-09-19 4 views
0

私のプログラムは、関数に渡される値の自然対数を出力します。奇妙なことは、私がダミー変数に値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

'double ret_val;':初期化されていない変数を使用しました。 – BLUEPIXY

+0

また、組み込みの関数名( 'log'と' pow')を使用しないでください。 – BLUEPIXY

答えて

2
double ret_val; 

未定義の動作を呼び出し、あなたの関数log()に初期化されていないを使用しています。

2番目のケースでは、標準ヘッダmath.hlog()機能を提供しており、それが実行される(したがって、正しい結果が表示される)という事実にあると思います。

関数の間違った結果は、初期化されていない値です。

にあなたの関数を変更し

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 

今1はmath.hがあなたのコードに含まれていないことを考える必要がありますが、いくつかのコンパイラは、その彼らのヘッダーを含む傾向がありますあなたのケースで起こったことだと思う、と思う。

これらの厄介な状況を回避するには、組み込み関数名の使用を避けることをお勧めします。

+1

うん、あなたは正しかった!ありがとう。私の実装は間違っていたと思うし、正解は組み込みのログ機能によるものです。 – Ajayv

1

常に-Wallでコンパイルしながら、出現するすべての警告を学習して対処してください。これにより、初期化されていない戻り値logが直接回避されます。

あなたのパワー機能は、このようにあなたが入力変数のx squaringsが行う、ライン

val *= val; 

常にvalの最近の値の2乗を計算していない名前が示唆しているようval^xが、val^(2^(max(0,x)))を計算します。

関連する問題