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 个属性结果是通过上述程序得出的。第三行表示来自 OK 和 FRAUD 的所有 5 个值的乘积。但我的最终结果为零,无法比较这些值。

4

2 回答 2

2

你的任期

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

得出一个巨大的数字(27806155998094886059376640.000000)。该数字的倒数太小,无法显示 %f(使用 %e 为 3.596326e-26)。

尝试分离出你的大表达式的术语并检查它们的值。

编辑:

谢谢%e。但我现在需要比较两个%e值以获得我想要的结果。您能否建议我使用哪种数据类型来解决此问题?

不,您需要比较两个doublefloat值。%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()(其中包含 a )。const char *你甚至没有收到警告吗?你想做什么atoi()

于 2012-11-24T02:40:18.663 回答