浮点数精度

时间:2012-11-24 02:37:00

标签: c floating-point precision exp

  

可能重复:
  Precision of Floating Point

我正在尝试使用一些浮点数来计算概率,但总是我的最终结果是零。请查看以下代码和示例。

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个值的乘积。但我的最终结果是零,无法比较这些值。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

你正在使用atoi()(它接受一个const char *)看起来像一个int。你甚至没有收到警告吗?你想用atoi()做什么?