C:我的'泊松计算器'给了我#1.INF00。为什么会这样?

时间:2015-12-17 10:30:33

标签: c floating-point poisson

在此之前,这是我的代码:

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

main()
{
    float Exp, Act, Px, Facto_Act;
    printf("\n This is Poisson Distribution Calculator!");
    printf("\n Enter the expected value of success in a time period:");
    scanf("%f",& Exp);
    printf("\n Enter the actual or calculated value of success in a time period:");
    scanf("%f",& Act);
    Px=pow(M_E,-Exp)*pow(Exp,Act)/Facto_Act;
    printf("\n Poisson probability is:%f", Px);
    getch();
    return 0;
}

Facto_Act(float Act)
{
    float c;
    float result=1;
    for(c=1;c<=Act;c++)
        result=result*c;
    return result;
}

进一步说明:

泊松方程看起来像这样:

P(x)=(e ^ -Lambda)(Lambda ^ x)/(x!)

Exp:给定时间内的预期事件数(Lambda) 法案:给定时间内的实际事件数量(x) Px:在给定时间内发生事件的概率(P(x)) Facto_Act:给定时间内事件数量的因子(x!)

当我想出如何对C中的整数进行阶乘时,我将尝试为正小数添加阶乘。但#1.INF00不是我期望的值。

编译代码时,不再显示编码错误。但是当我输入一段时间内成功的预期值,然后是一段时间内成功的实际值时,我总是以#1.INF00结束。我很喜欢C,虽然这个网站帮助我改进了我的程序,但我无法理解'#1.INF00'的含义。

我决定不让Facto_Act成为一个功能

我决定通过不将Facto_Act设为函数来绕过整个Facto_Act函数问题,然后尝试调用它。似乎可以在不为其创建新功能的情况下执行阶乘。因此Facto_Act现在是一个变量。这是我的新代码:

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


main()
{
    double Exp, Px;
    int c, Act, Act2, Facto_Act=1;
    printf("\n This is Poisson Distribution Calculator!");
    printf("\n Enter the expected value of success in a time period:");
    scanf("%lf",& Exp);
    printf("\n Enter the actual or calculated value of success 
    \n in a time period(must be an integer!):");
    scanf("%d",& Act);
    /*My factorial starts here*/
    for (c=1;c<=Act;c++)
        Facto_Act=Facto_Act*c;
    /*My factorial ends here*/
    Px=(pow(M_E,-Exp))*(pow(Exp,Act))/Facto_Act;
    printf("\n Poisson probability is:%lf", Px);
    getch();
    return 0;
}

我感谢大家帮助我。

1 个答案:

答案 0 :(得分:1)

您声明了一个名为FactoAct的变量,类型为float。由于它是一个没有初始化的外部变量,因此它的值为0.

稍后您定义一个函数Facto_Act(float Act),其隐式返回类型为&#34; int&#34;。

您的部门xxx / FactoAct将xxx除以变量FactoAct,该变量为零。那是你的INF结果来自哪里。

当你在顶部有函数时,当编译器看到xxx / FactoAct时,FactoAct不是调用函数的结果,它是函数本身。您不能通过函数划分数字。它没有意义。你可以用函数做的唯一事情是获取它的地址,或者调用它。

你可能想要FactoAct(x)或类似的东西。

PS。不要使用float而不是double,除非你有理由说明为什么在你的特定情况下float为优于double。