浮点数(小数)在计算机中如何用二进制存储?

您所在的位置:网站首页 怎样转化二进制数 浮点数(小数)在计算机中如何用二进制存储?

浮点数(小数)在计算机中如何用二进制存储?

2024-07-14 17:59| 来源: 网络整理| 查看: 265

浮点数在计算机中如何用二进制存储? 前言

前面我有篇博文详解了二进制数,以及如何同二进制数表示整数。但是,计算机处理的不仅仅是整数,还有小数,同样小数在计算机也是用二进制进行存储的,但是,二进制如何去存储小数呢?计算机对于小数的计算又是否真的丝毫不差呢?本文将进行介绍。

一、用二进制表示小数

二进制转换为十进制的方法就是各个位的数字与位权乘积之和。二进制数小数点前面部分的位权,第 1 位是 2 的 0 次幂、第 2 位 是 2 的 1 次幂……以此类推。小数点后面部分的位权,第 1 位是 2 的-1次幂、第2位是2的-2次幂。以此类推。0次幂前面的位的位权 按照 1 次幂、2 次幂……的方式递增,0 次幂以后的位的位权按照-1 次幂、-2次幂……的方式递减。这一规律并不仅限于二进制数,在十 进制数和十六进制数中也同样适用。 如把1011.0011这个有小数点的二进制数转换成十进制数过程如下: 在这里插入图片描述

二、计算机并不是永远准确的

我们可以很快算出,0.1累加100次后的结果是10,但是计算机算出来结果是10吗?实际上它计算出的结果是10.0000002

#include void main(){ float sum; int i; // 将保存总和的变量清 0 sum = 0; //0.1 相加 100 次 for (i = 1; i = 0; i--) { // 加入破折号来区分符号部分、指数部分和尾数部分 if (i==1||i==10) { s[i] = '-'; } else { // 为各个字节赋值 '0' 或者 '1' if (buff % 2 == 1) { s[i]='1'; } else { s[i]='0'; } buff/=2; } } s[34]='\0'; printf("%s\n",s); }

运行结果如下 在这里插入图片描述 这里,符号部分为0,指数部分为 01111110,尾数部分为 10000000000000000000000。因为 0.75 是 正数,所以符号位是 0。指数部分的 01111110 是十进制数 126,用 EXCESS系统表现就是- 1(126- 127 = - 1)。根据正则表达式的规则, 小数点前面的第1位是1,因此尾数部分10000000000000000000000实 际上表示的是1.10000000000000000000000这个二进制数。将尾数部分 的二进制数转换成十进制数,结果就是(1 × 2的0次幂)+(1 × 2的-1次幂) = 1.5。因此,0-01111110-10000000000000000000000这个单精度 浮点数,表示的就是“+ 1.5 × 2的-1次幂”。2的-1次幂是0.5,+ 1.5 × 0.5 = + 0.75。正好吻合,结果正确。

如何避免计算机计算出错?

有两种方法: 第一、回避策略,即无视这些错误。 第二、把小数转换成整数来计算。例如,将0.1相加 100 次这一计算,就可以转换为将 0.1 扩大 10 倍后再将 1 相加 100 次的计算,最后把结果除以10就可以了。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3