我正在尝试使用一些浮点数来计算概率,但总是我的最终结果是零。请查看以下代码和示例。
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个值的乘积。但我的最终结果是零,无法比较这些值。
答案 0 :(得分:2)
你的任期
pow(2.71828, ((pow...)))
出现了一个巨大的数字(27806155998094886059376640.000000)。该数字的倒数太小,无法显示%f(%e为3.596326e-26)。
尝试分离出大表达式的术语并检查它们的值。
编辑:
感谢
%e
。但我现在需要比较两个%e
值以获得我想要的结果。您能否建议我使用哪种数据类型来解决此问题?
您无需比较两个double
或float
值。 %e只是打印格式...
很抱歉,如果这太基础了,但要比较数字,请使用类似
的内容float a = ...;
float b = ...;
if (a > b) {
printf("%e\n", a);
} else {
printf("%e\n", b);
}
答案 1 :(得分:1)
你正在使用atoi()
(它接受一个const char *
)看起来像一个int。你甚至没有收到警告吗?你想用atoi()
做什么?