无法解决浮点异常

时间:2014-09-24 03:10:05

标签: c floating-point cs50

我正在尝试通过哈佛完成CS50x的问题集1,我在程序中遇到了一些错误。它向我抛出一个浮点异常错误;我对此进行了相当多的研究,似乎主要是在你试图除以零时引起的。现在,当我查看我的代码时,我似乎无法找到一个变量甚至等于零的地方,更不用说除零了。

#include <stdio.h>
#include <cs50.h>

int changeF(change, div)
{
    int c = change/div;
    return c;
}

int main(void)
{
    printf("Enter the bill amount:");
    float bill = GetFloat();
    printf("Enter the payment amount:");
    float payment = GetFloat();
    float q = .25; float di = .1; float n = .05; float p = .01;
    float change = payment - bill;
    do
    {
        if (bill >= 0 && payment >= 0 && change >= 0)
        {
            if (change >= q)
            {
                float quarters = changeF(change, q);
                printf("%f quarters", quarters);
                change = change - (.25*quarters);
            }
            if (change >= di)
            {
                float dimes = changeF(change, di);
                printf("%f dimes", dimes);
                change = change - (.1*dimes);
            }
            if (change >= n)
            {   
                float nickels = changeF(change, n);
                printf("%f nickels", nickels);
                change = change - (.05*nickels);
            }
            if (change >= p)
            {
                float pennies = changeF(change, p);
                printf("%f pennies", pennies);
                change = change - (.01*pennies);
            }
        }
    }
    while (change > 0);
}

3 个答案:

答案 0 :(得分:1)

您需要为函数参数赋予类型:

 changeF(float change, float div)

我不确定你是否真的希望将此函数返回为int或float!

答案 1 :(得分:1)

您的changeF()函数已写入:

int changeF(change, div)
{
    int c = change/div;
    return c;
}

对于函数使用旧的(C89或预标准 - 不是更新的C99或C11)表示法,隐式声明changeF()采用两个int参数。

当您致changeF() float的{​​{1}}参数值小于1.0时,它会转换为div int的值0 1}}。然后除以该零,得到你的FPE。

答案 2 :(得分:0)

int changeF(change, div)

问题在于此功能。它的返回类型为int,因此,当c具有值0.10.2或类似内容时,它会变为0并返回它。另一个问题是你没有在定义中指定数据类型(旧式K&amp; R预标准函数定义)。这就是默认数据类型和默认数据类型的原因int

您应该按以下方式更新代码。

double changeF(double change, double div)