首页 > 其他分享 >计算机进行小数运算时出错的原因

计算机进行小数运算时出错的原因

时间:2024-02-14 20:22:23浏览次数:32  
标签:表示 0.1 运算 二进制 尾数 出错 十进制 小数

      首先计算机计算也是会出现错误的,比如0.1累加100次应该为10,但若用计算机运算却得出的结果为10.000002,如图所示:

     

但为什么会出现错误计算呢?这是因为有一些十进制的小数无法转换成二进制数。或许先了解如何用二进制数表示小数更容易明白为什么无法转换。首先对于正数第二章已经介绍过在计算机内部如何用二进制表示,但小数呢?比如1011.0011如何转换成十进制数呢?整数的转换第二章就说明过了,因此这里自然着重说小数点后面的怎样转换,其实计算方法与整数是一样的,只不过变成了2的负几次幂。例如小数点后第一位就是0×2负1次幂,以此类推.0011换算成十进制数就是0.125+0.0625=0.1875。所以整个转换结果就是11+0.1875=11.1875。如图所示:

        现在知道了如何转换,那么现在讨论为什么无法表示就更加明显。首先0.1其实是无法用二进制数表示的,有下面一张图就明白为何:(二进制数是连续的,十进制数是非连续的) 在0.0000~0.1111期间转换是没办法正确表示0.1的,因为转换成十进制数0的下面是0.0625,紧接着就是0.125,根本没有0.1,若用二进制数表示0.1就是一个循环数,就像十进制中无法用小数完全表示三分之一一样,因此在遇到十进制中的循环小数也是无法用二进制数完全表示的,这样就是计算机有计算错误的原因。那么应该怎样正确表示小数呢?其实可以用浮点数来表示,浮点数的构成是符号、尾数、基数、指数(二进制中基数为2不需再考虑),其中有两种类型:双精度浮点数,在C语言中用double表示,精度为64位。单精度浮点数在C语言中用float表示,精度为32位。他们两个都会被分为3部分,符号部分、指数部分和尾数部分,其中当属尾数部分所占数据最多,如图所示:

         符号部分是指使用一个数据位来表示数值的符号两者都是一位数,一般是1或0,为1时表示负,0时表示“正或0”。而数值的大小都是由尾数部分和指数部分表示,而这里小数就是用“尾数部分×2的指数部分次幂”。 但尾数部分用的是“正则表达式”,指数部分用的是“EXCESS系统表现的”。 那么什么时正则表达式呢?就是将表现形式多样的浮点统一为一种表现形式,例如十进制中小数点前面是0,小数点后面第一位不能是0的规则表示的小数就是正则表达式。而二进制就是将小数点前的数固定为1的正则表达式,下图是二进制数成为正则表达式的过程:

“EXCESS系统表示”是将指数部分表示范围的中间值设为0,使得负数不需要用符号来表示。 最后本章最终应该解释的是如何避免计算机计算错误这个问题:1、无视这个问题。 2、将小数转换成整数来计算。但对于不允许出现误差的情况下,要用第二种方法或BCD方法(用四位数来表示0~9的1位数的处理方法)。

标签:表示,0.1,运算,二进制,尾数,出错,十进制,小数
From: https://www.cnblogs.com/G-y-l-123/p/18015556

相关文章

  • 微分积分及其运算法则成对列举
         ......
  • 取模运算
    一、模运算的定义对于\(\forall~a\in\mathbb{R},~m\in(0,+\infty)\),求\(a\)除以\(m\)的余数的运算,就是取模运算,记作\(a~mod~m\)。规定\(0\leqa~mod~m\leqm-1\)。若\(a\)为负数,则\(a~\%~m\)可能小于\(0\)。此时,对结果进行\(a~\%~m+m\),使取模运算满足规定......
  • 第3章 计算机进行小数运算是出错的原因读后感
    计算机进行小数运算是出错的原因读后感在《程序是怎样跑起来的》这本书的第三章中,我找到了对于计算机进行小数运算时出错原因的解答。这一章节深入地探讨了计算机处理小数的细节,以及浮点数运算中可能出现的误差和......
  • 第三章:计算机进行小数运算时出错的原因
    在阅读《程序是怎样跑起来的》第3章“计算机进行小数运算时出错的原因”后,我深刻地认识到了计算机在进行浮点数运算时的局限性和潜在风险。这一章内容让我明白了,为什么在实际编程过程中,我们经常会遇到浮点数运算的误差问题。首先,我了解到计算机使用二进制来表示所有的数据,包括浮......
  • 编程新手必学:Java运算符详解
    编程新手必学:Java运算符详解编程,这种强大的艺术形式,给我们带来了无穷的可能性。就像数学中的加减乘除,程序设计中也有一种类似的工具:运算符。作为一种编程语言,Java提供了一系列的运算符来执行各种基础和复杂的操作。在本文中,我将尝试解释Java中的各种运算符,并提供一些代码示例来说......
  • Java 数学运算与条件语句全解析
    JavaMathJava的Math类拥有许多方法,允许您在数字上执行数学任务。常用方法:Math.max(x,y):找到x和y的最大值Math.min(x,y):找到x和y的最小值Math.sqrt(x):返回x的平方根Math.abs(x):返回x的绝对值Math.random():返回一个介于0.0和1.0之间的随机......
  • Java 数学运算与条件语句全解析
    JavaMathJava的Math类拥有许多方法,允许您在数字上执行数学任务。常用方法:Math.max(x,y):找到x和y的最大值Math.min(x,y):找到x和y的最小值Math.sqrt(x):返回x的平方根Math.abs(x):返回x的绝对值Math.random():返回一个介于0.0和1.0之间的随......
  • 运算符重载
    运算符重载本质重新定义运算符的操作,返回自定义的结果。对于Aoperatorsign(Bres1,Cres2)B类型的res1和C类型的res2,进行sign操作,返回一个类型是A的结果。1.一元运算符重载(1)重载++classstudent{public:inta;student(inta){......
  • 位运算
    对二进制中的每一位进行逻辑操作,而不考虑整个数的数值大小与位运算有关的特殊数据结构如[[树状数组]]或[[01线性基]]一般对正整数进行运算几种位运算按位与AND&只有两个位都为1时,结果才为1,否则为0。两个数字做与运算,结果不会变大。做如下变换:1001911011......
  • 【算法】位运算
    常见的位运算操作(操作对象为正整数时)1.按位与(&):当两个数全为1才为1,否则为0。两个数字做与运算,结果不会变大。2.按位或(|):当两个数中有一个1为1,否则为0。两个数字做或运算,结果不会变小。3.按位异或(^):两个数不同为1,相同为0.两个数字做异或运算,结果可能变大,也可能变小。异或的......