3

N の高調波値 (1+1/2+1/3+...1/N) を見つけるために、次のサンプル コードを作成しました。太字で書かれたコードのコメントを読んで、なぜこのようなことが起こっているのかを見つけてください。

#include <stdio.h>

float harmonic(float n, float har) {

    if(n==0) {
        return 0;
    }

    if(n==1) {
        printf("%f\n", har+1.0f);***/* This prints value 1.5000*/***
        return har+1.0f;
    }else{
        harmonic(n-1, (har+(1/n)));
    } 
} 

int main() 
{ 
    printf("%f\n", harmonic(2, 0.0f)); **/* But this prints value nan(Not a  Number)*/**  
    return 0; 
}

ありがとう、ナガ

4

2 に答える 2

10

私はあなたがやりたいと思う:

return harmonic(n-1, (har+(1/n)));
于 2010-03-01T15:38:41.310 に答える
2

私が最初に考えたのは、float と単純な等価性を比較することはほとんどないので、"if(n==0)" は "if(n<=EPSILON)" であり、"if(n==1)" は "if( n<= 1.0f + EPSILON)" ここで、EPSILON は小さい正の割合で、おそらく 1.0e-5 です。どの程度の精度に依存できるかによって異なります。

しかし、n は int でなければならないことに気付きました。分割前にフロートにキャストします。「n」との比較では、無限再帰のリスクがあります。

float の代わりに double を使用することを検討してください。

Matthew Flaschen の答えは、NaN メッセージを受け取る本当の理由になります。元のコードは「else」から何も返さないため、呼び出し元はおそらくスタックからガベージを読み取っています。したがって、NaN.

于 2010-03-01T16:45:27.743 に答える