0

重複の可能性:
浮動小数点の精度

いくつかの浮動小数点数を使用して確率を計算しようとしていますが、常に最終結果がゼロになります。以下のコードと例を見つけてください。

sd_attr4_ok = 3022.115234
unknwn_attr4 = 111
mean_attr4_ok = 32824.566406
var_attr4_ok = 9133180.000000

    (1/(sqrt(2*3.14)*sd_attr4_ok))*(1/pow(2.71828,((pow((atoi(unknwn_attr4)-mean_attr4_ok),2))/(2*var_attr4_ok))))

この問題を解決するために私を助けてください。

以下のプログラムを実行しても、0.000000 になります。

#include <stdio.h>
#include <math.h>

int main()
{
        float a=(1/(sqrt(2*3.14)*3022.115234))*(1/pow(2.71828,(pow((111-32824.5666406),2))/(2*9133180)));
        printf("The probability is - %f\n",a);
        return 0;
}

同様に、以下のプログラムを実行しても 0.000000 になります。

#include <stdio.h>
#include <math.h>

int main()
{
        float a=(1/(sqrt(2*3.14)*3022.115234));
        float b=pow((111-32824.5666406),2)/(2*9133180);
        float c=pow(2.71828,b);
        float d=1/c;
        printf("The probability is %f-%f-%f-%f\n",a,b,c,d);
        return 0;
}

私の結果セット:

***OK*** 0.908396-0.000084-0.000168-0.000000-0.000000
***FRAUD*** 0.091604-0.000835-0.000835-0.000000-0.000000
***OK FRAUD*** 0.000000 0.000000

上記の結果が表示された場合、4 番目と 5 番目の属性の結果は上記のプログラムから取得されています。3 行目は、OK と FRAUD からの 5 つの値すべての積を表しています。しかし、私の最終結果はゼロになり、値を比較できません。

4

2 に答える 2

2

あなたの任期

pow(2.71828, ((pow...)))

膨大な数 (27806155998094886059376640.000000) になります。その数値の逆数は小さすぎて %f で表示できません (%e では 3.596326e-26 です)。

大きな式の項を分離し、それらの値を確認してみてください。

編集:

ありがとうござい%eます。%eしかし、目的の結果を得るには、2 つの値を比較する必要があります。この問題を解決するために使用する必要があるデータ型を教えていただけますか?

doubleいいえ、2 つまたはfloat値を比較する必要はありません。%e は単なる印刷形式です...

これが基本的すぎる場合は申し訳ありませんが、数値を比較するには次のようなものを使用します

float a = ...;
float b = ...;
if (a > b) {
    printf("%e\n", a);
} else {
    printf("%e\n", b);
}
于 2012-11-24T02:48:23.187 に答える
1

int のように見えるものを使用していますatoi()(これは を取り込みます)。const char *あなたはそれについて警告を受けていませんか?あなたは何をしようとしていatoi()ますか?

于 2012-11-24T02:40:18.663 に答える