首页 > 编程语言 >《程序是怎样跑起来的》——第3章 计算机进行小数运算时出错的原因

《程序是怎样跑起来的》——第3章 计算机进行小数运算时出错的原因

时间:2024-02-18 19:22:53浏览次数:33  
标签:表示 运算 单精度 二进制 浮点数 数值 出错 小数

一、计算机进行小数运算时也会出错
1、计算机不是万能的:计算机在运行的时候绝大多数的时候能得到正确的数值,但依然存在程序运行后无发得到正确数值的情况。小数运算就是这样。
2、示例:将0.1累加100次也得不到10


但与之相反的是,0.1累加00此后的结果是10。正是这样计算机在运行小数的时候也会存在错误的情况。
二、用二进制数表示小数
1、原因:由于计算机内部所有的信息都是以二进制数的形式来处理的,因此在这一点上,整数和小数并无差别。不过,使用二进制数来表示整数和小数的方法却有很大的不同。
2、示例:把1011.0011这个有小数点的二进制数转换成十进制数

只需将个数为数值和位权相乘,然后再将相乘的结果相加即可实现。(位权是用来与各数字位的数字相乘的数值)
三、计算机出错的原因
1、原因:计算机之所以会出现运算错误,是因为“有一些十进制数的小数无法转换成二进制数”。
2、示例:小数点后4位用二进制数表示时的数值范围为0.0000~0.1111。这里只能表示0.5、0.25、0.125、0.0625这四个二进制数小数点后面的位权组合而成(相加总和)的小数。将这些数值组合后能够表示的数值。
小数点后4位能够用二进制数表示的数值二进制数是连续的,十进制数是非连贯的。

实际上,十进制数0.1转换成二进制后,会变成0.00011001100…(1100循环)这样的循环小数。
四、浮点数
1、概念:浮点数是指用符号、尾数、基数和指数这四部分来表示的小数。
2、类型:双精度浮点数和单精度浮点数。(在C语言中,双精度浮点数类型和单精度浮点数类型分别用double和float来表示。)
(1)双精度浮点数:双精度浮点数类型用64位来表示全体小数。
(2)单精度浮点数:单精度浮点数类型用32位来表示全体小数。
3、表现形式:由符号、尾数、基数、指数四部分构成。

因为计算机内部使用的是二进制数,所以基数自然就是2。因此,实际的数据中往往不考虑基数,只用符号、尾数、指数这三部分即可表示浮点数。
4、浮点数范围:

5、浮点数的内部构造:
浮点数的表现方式有很多种,这里我们使用最为普遍的IEEE(IEEE(Institute of Electrical and Electronics Engineers)是指美国电气和电子工程师协会。该协会制定了计算机领域的各种规定。读作“eye-triple-e,I-3E”。)标准。双精度浮点数和单精度浮点数在表示同一个数值时使用的位数不同。此外,双精度浮点数能够表示的数值范围要大于单精度浮点数。

(1)符号部分是指使用一个数据位来表示数值的符号。该数据位是1时表示负,为0时则表示“正或者0”。这和用二进制数来表示整数时的符号位是同样的。数值的大小用尾数部分和指数部分来表示。
(2)尾数部分用的是“将小数点前面的值固定为1的正则表达式”。
(3)指数部分用的则是“EXCESS系统表现”。
五、正则表达式和EXCESS系统
1、正则表达式:按照特定的规则来表示数据的形式即为正则表达式。除小数之外,字符串以及数据库等,也都有各自的正则表达式。
(1)尾数部分使用正则表达式”,可以将表现形式多样的浮点数统一为一种表现形式。
(2)浮点数可以用不同的形式表现同一个数值:

(3)在二进制数中,我们使用的是“将小数点前面的值固定为1的正则表达式”。具体来讲,就是将二进制数表示的小数左移或右移(这里是逻辑移位。因为符号位是独立的)数次后,整数部分的第1位变为1,第2位之后都变为0(这样是为了消除第2位以上的数位)。
(4)示例:单精度浮点数中,尾数部分是23位,但由于第1位的1被省略了,所以实际上可以表示24位的数值。双精度浮点数的表示方法也是如此,只是位数不同而已。
单精度浮点数尾数部分的正则表达式

2、EXCESS系统
(1)EXCESS系统表现是指,通过将指数部分表示范围的中间值设为0,使得负数不需要用符号来表示。
(2)示例:单精度浮点数指数部分的EXCESS系统表现

六、如何避免计算机计算出错
1、回避策略:无视这些错误。一般来讲,在科学技术计算领域,计算机的计算结果只要能得到近似值就足够了。那些微小的误差完全可以忽略掉。
2、把小数转换成整数:计算机在进行小数计算时可能会出错,但进行整数计算(只要不超过可处理的数值范围)时一定不会出现问题。因此,进行小数的计算时可以暂时使用整数,然后再把计算结果用小数表示出来即可。
3、除此之外,BCD(Binary Coded Decimal )也是一种使用二进制表示十进制的方法。

标签:表示,运算,单精度,二进制,浮点数,数值,出错,小数
From: https://www.cnblogs.com/Li204217/p/18019832

相关文章

  • 计算机用小数运算时出错的原因
    1.采用浮点数来处理小数,会存在计算出错的可能性,无论是使用单精度浮点数还是双精度浮点数1。2.有些十进制的小数无法正确地转换成二进制,因此无法在计算机中准确表示23。3.计算机只能用有限的状态去和无限的需要表现的数去一一对应,这可能会导致误差的出现4。所以尽管计算机在计......
  • 对于计算机运算小数出错的认识(《程序是怎样跑起来的》第3章)
    通过阅读《程序是怎样跑起来的》第三章,我对于计算机处理数据有了进一步的了解。在第二章中我对于计算机使用二进制处理数据仅仅停留在处理整数部分,而在第三章,我认识到了计算机对于小数部分的处理。在书中说计算机处理小数部分往往会出错,阅读后我知道了其缘由,我认为及其根本是因为......
  • 进行小数运算时出错的原因
    采用浮点数来处理小数,会存在计算出错的可能性,无论是使用单精度浮点数还是双精度浮点数1。2.有些十进制的小数无法正确地转换成二进制,因此无法在计算机中准确表示3.计算机只能用有限的状态去和无限的需要表现的数去一一对应,这可能会导致误差的出现所以尽管计算机在计算小数时可......
  • C语言运算符顺序及优先级
    逗号运算符是优先级最低的。通常单目运算符优先级大于双目。三目最小。但需注意,双目运算符中的赋值运算符优先级是最低的。在C语言中,大部分运算符都是从左向右进行计算的,但是也存在一些自右向左的运算符。其中最常见的自右向左的运算符是赋值运算符 = 和逗号运算符 ,。赋......
  • 《程序是怎样跑起来的》读后感——第三章 计算机进行运算小数时出错的原因
    一、二进制的限制计算机内部所有的信息都是以二进制的形式存储和处理的。然而,并非所有的十进制小数都能被精确地用二进制表示。例如,0.1在十进制中是一个无限循环小数,但在二进制中却无法精确表示,只能进行近似表示。这种差异导致了计算机在运算小数时可能出现误差。二、浮点数表示......
  • 《程序是怎样跑起来的》计算机在计算小数时会出错的原因
    一,原因无法准确表示的值,就只能用近似值来表示计算机能力有限,无法处理无限小数,只能根据变量所对应的数据类型的数,采取四舍五入处理法进行处理。由于二进制为近似数,转化为十进制后与所求值存在误差,它是一种正常的现象。二,浮点数分类:双精度浮点类型有64位单精度浮点类型有32位......
  • JavaSE第五步 —— 运算符
    一、运算符运算符的分类不尽相同,以下都是参考的相关书籍名称符号算数运算符一元运算符++、--算术运算符二元运算符+、-、*、/、%赋值运算符=扩展运算符+=、-=、*=、/=关系运算符>、<、=、>=、<=、==、!=、instanceof逻辑运算符&&、位......
  • 如何在 JavaScript 中使用大于和小于运算符
    在你的JavaScript程序中,你经常需要比较两个值,以确定一个是否大于另一个或小于另一个。这就是大于和小于运算符派上用场的地方。在本文中,我们将通过代码示例更详细地介绍如何使用这些运算符。(本文内容参考:java567.com)如何在JavaScript中使用大于运算符>你可以使用大于运算......
  • 运算符总结
    publicclass基本运算符{publicstaticvoidmain(String[]args){//算术运算符//二元运算符inta=10;intb=20;intc=25;intd=25;System.out.println(a+b);System.out.println(a-b);......
  • 第3章计算机进行小数运算时出错的原因
    使用二进制数表示小数与二进制表示整数类似,二进制表示小数部分的转换方法也是小数位各数值乘以位权相加表示例如将1011.0011二进制小数转换为十进制数,转换过程如下规律:0次方前面的位的位权按照1,2,3方式向左高位递增(小数点前)0次方后面的位的位权按照﹣1,-2,-3方式向右低位递减(小......