【问题标题】:Floating Point Exception Error浮点异常错误
【发布时间】:2015-08-10 16:08:20
【问题描述】:

这个程序编译得很好,但是当我运行它时它返回一个消息“浮点异常”。我查看了其他线程,问题似乎是除以 0,但我查看了程序,整个程序中没有除零。我什至使用了绝对值函数以防万一。

顺便说一句,该程序旨在减少分数。

示例输入:612,代表分数6/12
预期输出:1/2

#include <stdio.h>

/*declaring variables*/
int num1, num2, num1b, num2b, gcd, x;
int higher, lower, higher_2, lower_2;

/*declaring functions*/
int find_gcd(int num1, int num2);
void reduce(int numerator, int denominator, int *reduced_numerator, int *reduced_denominator);

int main(void)
{
    do
    {
        printf("enter 2 numbers:  ");
        scanf("%d %d", &num1, &num2);
        reduce(higher, lower, &higher_2, &lower_2);
        printf("enter 0 to end program and any number continue: \n");
        scanf("%d", &x);
    } while(x != 0);

    return 0;
}

void reduce(int numerator, int denominator, int *reduced_numerator, int *reduced_denominator)
{
    num1=numerator;
    num2=denominator;

    gcd =find_gcd(numerator, denominator);

    *reduced_numerator = (numerator/abs(gcd));
    *reduced_denominator = (denominator/abs(gcd));

    printf("The GCD is %d/%d\n", *reduced_numerator, *reduced_denominator); 
}

int find_gcd(int m, int n)
{
    while (n != 0) {
        int remainder = m % n;
        m = n;
        n = remainder;
    }
    return m;
}

【问题讨论】:

  • 整数除法的结果可能会变为零,你考虑过吗?
  • 在调试器中运行,并逐行执行代码。如果没有别的,调试器会在异常发生时停止,让你看看它在哪里,以及所涉及的变量的值是什么。
  • 使用调试器。您应该能够在调试器中轻松找到问题。
  • 虽然问题很容易看出,但是当你调用reduce函数时,你认为higherlower的全局变量的值是什么?你在哪里分配给他们?
  • 避免全局变量,避免不必要的变量(如 num1=numerator)

标签: c++ c


【解决方案1】:

您的主要问题是您没有将输入值 num1num2 传递给您的 reduce() 函数。相反,您传递的是全局变量higherlower。您没有为它们分配任何值,但默认情况下全局变量始终初始化为 0。因此,您会遇到异常,因为在 reduce() 中您将 0 除以 0。您可以使用调试器进行验证。

如果我将您的main() 更改如下,那么您的代码至少适用于以612 作为输入的测试用例:

int main(void)
{
    do
    {
        printf("enter 2 numbers:  ");
        scanf("%d %d", &num1, &num2);
        reduce(num1, num2, &higher_2, &lower_2);
        printf("enter 0 to end program and any number continue: \n");
        scanf("%d", &x);
    } while(x != 0);

    return 0;
}

输出:

输入 2 个数字:6
12
GCD 为 1/2
输入 0 结束程序,任意数字继续:


正如 cmets 中所指出的,您还应该摆脱全局变量和虚假变量。因此,您应该首先删除代码中的以下几行:

/*declaring variables*/
int num1, num2, num1b, num2b, gcd, x;
int higher, lower, higher_2, lower_2;

然后让您的main() 函数按以下方式启动:

int main(void)
{
    int num1, num2, higher_2, lower_2, x;
    ...
}

你的reduce() 函数应该是这样的:

void reduce(int numerator, int denominator, int *reduced_numerator, int *reduced_denominator)
{
    int gcd = find_gcd(numerator, denominator);

    *reduced_numerator = (numerator/abs(gcd));
    *reduced_denominator = (denominator/abs(gcd));

    printf("The GCD is %d/%d\n", *reduced_numerator, *reduced_denominator); 
}

到目前为止,您没有在 main() 函数中使用变量 higher_2lower_2,但我猜您打算这样做。如果没有,你也可以连同reduce()函数的参数3和4一起去掉它们。


您提供的代码还有另一个问题(感谢@user3629249 指出):您缺少abs() 函数的包含。因此,您需要在代码的开头添加行 #include &lt;stdlib.h&gt;include &lt;math.h&gt; 也是如此,Windows 上的 include &lt;Windows.h&gt; 也是如此)。

【讨论】:

  • 谢谢!我在函数调用中有变量higher_2 和lower_2,因为该函数需要4 个参数,当我摆脱它们时会收到一条错误消息。我假设higher_2 和lower_2 分别是reduce_numerator 和reduce_denominator 的“实际参数”(我希望我正确使用了这个词)表示。我对编程很陌生,所以我的假设很有可能是错误的。
  • @LionelMessi:如果你想去掉函数参数,那么你必须从函数声明、函数定义以及调用函数的所有地方删除它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多