Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 447|回复: 0

关于Linux系统下错误“浮点数异常(核心已转储)”的分析

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-6-2 09:05:42 | 显示全部楼层 |阅读模式

    1.问题发现
      有这样一段代码:
      #include <stdio.h>
       int main()
       {
          int a, b, num1, num2, temp;
          printf("please input two numbers:\n");
          scanf("%d,%d", &num1, &num2);
          if(num1 > 0 && num2 > 0) (1)
          {
             a = num1;
             b = num2;
             temp = a%b;
          }
          while(b != 0) (2)
          {
             a = b;
             b = temp;
             temp = a%b;
          }
          printf("gong yue shu : %d\n", a);
          printf("gong bei shu : %d\n", num1*num2/a);
          return 0;
       }
      该代码输入任何数字的执行结果(如图1)都是“浮点数异常(核心已转储)”,刚刚见到这个问题让人感觉摸不着头绪,程序根本没有用到浮点数,怎么会报告浮点数异常;
      
      图1.程序运行结果
      
    2.问题分析
      
      下面我们通过Linux自带调试工具Gdb来进行调试,观察程序的运行状况。在编译的是个加上“-g”选项,方便利用Gdb调试。


      
      图2.编译和调试指令
      
      程序编译没有错误,下面使用Gdb工具调试;在不知道问题产生根源的情况下,先在(1)处设置断点,全速运行;
      
      
      图3.断点之前运行情况
      从图3可见,进入断点前,程序运行正常;下面查看变量num1、num2的值。
      
      
      图4.变量赋值情况
      
      由图4可见,变量num1、num2的值正常读入。下面将断点设置在(2)处,全速运行。
      
      
      图5.进入断点2前程序运行情况
      
      由图4可见,进入while循环之前,程序正常运行。查看变量a、b赋值情况发现此时变量a、b均按照程序预期赋值。
      
      
      图6.变量a、b赋值情况
      
      下面开始单步运行。由图7可见,第一次循环结束变量a的值为4,b的值
      
      
      图7.第一次循环执行情况
      
    为2,temp的值为0;继续单步运行。从图8可以看出,在第二次进入循环执行


      

      图8.第二次循环执行情况

    语句“temp = a%b;”的时候出现了错误。分析变量值发现此时变量a的值为2,b的值为0,对0求余是没有意义的,语法不允许。到此,问题水落石出。
      现在,我们编写测试代码对问题产生原因进行验证,代码如下:
      
      #include <stdio.h>
      int main(int argc , char *argv[])
      {
         int a=5,b=0;
         printf("%d\n",a%b);
         return 0;
      }
      
      
      图9.测试代码运行情况
      
      由图9可见,该错误系求余运算符右边操作数为0值所致。如果把测试代码的“a%b”改为“a/b”,运行结果仍然是浮点数例外。求余运算和除法运算不允许右边的操作数为0值,我们在编写程序的时候需小心谨慎,注意程序的逻辑,避免之中错误的发生。问题代码系网上引用,其中辗转相除法的逻辑错误,此处不加讨论。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-10 03:15 , Processed in 0.068961 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表