c - 计算GCD时出现 float 异常(core dumped)

标签 c floating-point coredump

我正在编写一个程序来将分数减少到最低项。这是我的程序:

#include <stdio.h>
int main(){
    int m,x,n,gcd;
    printf("Enter a fraction: ");
    scanf("%d/%d",&n,&m);

    if(m==0)printf("Error");
    else
        for(;;){
           x=m%n;
           if(x==0){
              gcd=n;
              m/=gcd;
              n/=gcd;
              printf("In lowest terms: %d/%d",n,m);
            }else
                m=n;
                n=x;
         }

    return 0;
}

我使用 Euclid 算法计算 GCD。执行时,它报告

Floating point exception (core dumped)

我的代码有什么问题?

最佳答案

您已成为此处阻塞作用域的牺牲品:

if(x==0){
    // ...
}else
    m=n;
    n=x;

这将被执行为:

if(x==0){
    // ...
}else{
    m=n;
}
n=x;

这意味着当 x 为零时,n 在循环结束时被设置为零。当你再次转过来计算m % n时,你遇到了问题。或者,如果出于某种原因给出一个值而不会导致程序崩溃,那么 gcd = n 将在您随后除以 m 时最终给您被零除 n 通过 gcd

如果您希望多个语句成为else 分支的一部分,那么您需要将它们括在大括号中,如下所示:

if(x==0){
    // ...
}else{
    m=n;
    n=x;
}

事实上,始终使用大括号是一种很好的做法,即使只有一个语句也是如此。在我的工作场所,这甚至包含在我们的编码标准中,并且是代码审查过程的一部分。

关于c - 计算GCD时出现 float 异常(core dumped),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32516308/

相关文章:

c - 在单个进程中管理多个套接字(最多 50 个套接字)的最有效方法?

c++ - 将 bitset 与 float 类型一起使用

c++ - 如何在 C++ 中操作 float 的小数部分?

c - fgets 不读取 C 中的完整行

c - 为什么会出现段错误+如何消除它?

c++ - 随机错误核心转储: `./a.out'中的错误:free():下一个大小无效(快速):0x00000000010e8d70 ***已中止(核心转储)

c - printf 忽略单个反斜杠 '\'

c - 在 C 中复制后文件校验和不相同

c - openMP 线程和迭代

math - float 学有问题吗?