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

Posted arun-python

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了004_详解计算机各种语言浮点数运算会存在精度损失原因相关的知识,希望对你有一定的参考价值。

      数值数据是一种带符号数,有正负之分.在计算机中对数据进行运算操作时,符号位如何表示?是否也同数值位一道参加运算?如参加,会给运算操作带来什么影响?为了妥善处理好这些问题,就产生了将数值位连同符号位一起编码来表示相应的数的各种表示方法,如数据的原码、补码、反码和移码表示法.

一、所有相关的码解释

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

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

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

负数补码=>反码+1

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

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

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

技术图片

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

(1)浮点数的表示方法

技术图片

 

 (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

技术图片

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

技术图片

 

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

技术图片

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

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

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

https://tool.oschina.net/hexconvert

技术图片

答案:

技术图片

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

技术图片

 

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

技术图片

<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_详解计算机各种语言浮点数运算会存在精度损失原因的主要内容,如果未能解决你的问题,请参考以下文章

数值金额计算js封装--包含加减乘除四个方法,能确保浮点数运算不丢失精度

js浮点数精度误差问题,解决方法

float精度问题

数值溢出与精度损失

两大基本数据类型 - 整数类型 / 浮点数类型

浮点数精度丢失问题详解