004_详解计算机各种语言浮点数运算会存在精度损失原因

摘要:
数字数据是一个有符号的数字,可以是正数或负数。在计算机中操作数据时,符号位是如何表示的?如果您参与,将对运营产生什么影响?参考:https://zh.wikipedia.org/wiki/IEEE_754IEEE754标准浮点数示例1IEEE754标准浮点数的示例2练习1:将100.5834转换为IEEE754标准单精度浮点数<1>首先,将100.583转换为二进制并将其转换为1100100.1001,这就是为什么不同的编程语言在操作浮点数时会出现精度损失的原因!!!
      数值数据是一种带符号数,有正负之分.在计算机中对数据进行运算操作时,符号位如何表示?是否也同数值位一道参加运算?如参加,会给运算操作带来什么影响?为了妥善处理好这些问题,就产生了将数值位连同符号位一起编码来表示相应的数的各种表示方法,如数据的原码、补码、反码和移码表示法.

一、所有相关的码解释

(1)正数的原码=反码=补码

负数原码=>最高位表示符号位,其余位为真值

负数反码=>符号位不变,其他位取反

负数补码=>反码+1

移码=>移码(又叫增码)是符号位取反的补码,一般用指数的移码减去1来做浮点数的阶码,引入的目的是为了保证浮点数的机器零为全0.

阶码=>在机器中表示一个浮点数时需要给出指数,这个指数用整数形式表示,这个整数叫做阶码,阶码指明了小数点在数据中的位置.

综合练习: 求-11的原码、补码、反码(8位表示)

004_详解计算机各种语言浮点数运算会存在精度损失原因第1张

二、浮点数运算失去精度原因

(1)浮点数的表示方法

004_详解计算机各种语言浮点数运算会存在精度损失原因第2张

 (2)IEEE754(英语发音读I tri for E)标准浮点数

因为读IEEE很难发音且容易读错,所以学术界一般读做 I triple for E(意思是IEEE);  IEEE二进制浮点数算术标准IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU浮点运算器所采用。Reference: https://zh.wikipedia.org/wiki/IEEE_754

004_详解计算机各种语言浮点数运算会存在精度损失原因第3张

(3)IEEE754标准浮点数例题1

004_详解计算机各种语言浮点数运算会存在精度损失原因第4张

 (4)IEEE754标准浮点数例题2

004_详解计算机各种语言浮点数运算会存在精度损失原因第5张

(5)练习题1: 将100.5834化为IEEE754标准单精度浮点数?

<1>首先把100.5834转成二进制为1100100.1001(为了便于手动运算,所以取小数点后四位,但为存在精度损失,取的越多精度越高,取四位后其实变成了100.5625),

这就是为什么浮点数在运算时不同的编程语言都会存在精度损失的原因!!!

https://tool.oschina.net/hexconvert

004_详解计算机各种语言浮点数运算会存在精度损失原因第6张

答案:

004_详解计算机各种语言浮点数运算会存在精度损失原因第7张

验证网站: http://www.binaryconvert.com/result_float.html?decimal=049048048046053054050053

004_详解计算机各种语言浮点数运算会存在精度损失原因第8张

附:浮点数的表示范围和溢出

004_详解计算机各种语言浮点数运算会存在精度损失原因第9张

<1>标准
http://grouper.ieee.org/groups/754/

<2>单精度浮点数内存中编码:
https://www.h-schmidt.net/FloatConverter/IEEE754.html
<3>双精度浮点数内存中编码:
http://www.binaryconvert.com/convert_double.html

免责声明:文章转载自《004_详解计算机各种语言浮点数运算会存在精度损失原因》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ubuntu下DNS配置方法Go net/http,web server下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python的整数没有补码一说

在刷题过程中,发现Python有一个和其他语言完全不一样的地方,就是对负数的二进制表示。Python里的数是无所谓Overflow的,即没有位数限制,因此也就无所谓补码,因为补码都是相对于位数来说的,32位补码和16位补码,肯定是不一样的。但是这样就导致了一个问题,就是无法直接得到32位二进制补码。 >>> bin(1) '0b1'...

深度理解 原码, 反码, 补码

本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机...

JavaScript数字精度丢失问题总结

  本文分为三个部分: 1、JS 数字精度丢失的一些典型问题(前端遇小数计算概率大,要有这个精度丢失的意识) 2、JS 数字精度丢失的原因(计算机用二进制存储数据,由于存储位置的限制有时会存在“舍去”。当模仿十进制进行四舍五入时,0舍1入,造成误差) 3、解决方案(一个对象+一个函数)(解决方案:把小数乘以倍数变成整数计算,再除以倍数变成原来的数。其中根据...

【进制转换】原码反码和补码的理解以及进制转换

一、编码理解: 1、原码: 正数:按照绝对值大小转换成的二进制数; 负数:按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。 00000000 00000000 00000000 00000101 是 5的 原码; 10000000 00000000 00000000 00000101 是 -5的 原码。 2、反码: 正数:与原码相同; 负...

Java中实现十进制数转换为二进制的三种方法

第一种:除基倒取余法 这是最符合我们平时的数学逻辑思维的,即输入一个十进制数n,每次用n除以2,把余数记下来,再用商去除以2...依次循环,直到商为0结束,把余数倒着依次排列,就构成了转换后的二进制数。 那么,在实际实现中,可以用int的一个数来存储最后的二进制,每次求余后把余数存储在int型数的低位,依次递增。 public void binaryToD...

STM32 无法通过 %f 打印浮点数

一、问题 使用 IAR 开发 STM32,发现无法通过 printf 重定向到串口打印出浮点数。代码如下: 输出结果如下: 可见,浮点数部分无法正常显示。 二、解决方法 这是由于 IAR 默认选择的 printf 库不支持浮点数的的输出。可在设置选项中修改。如下:默认使用 small,改为 auto 即可。 三、备注 在不修改设置的情况下,尝试过如...