小女也爱C#(2)----从浮点数存储看中国式教育

本文从历史视角出发,详细解析中国式教育中关于浮点数存储的简化公式,通过引入美国电气和电子工程师协会(IEEE)及其浮点数存储标准 IEEE754 的背景知识,阐述了其历史发展、存储结构和算法原理。文章对比了传统存储方式与 IEEE754 标准的优劣,强调了标准化在计算机通信中的重要性。

小女2个月前学习了浮点数的运算,用两个字来回答,不懂,一点也不明白,不明白浮点数在计算机中为什么要处理这么复杂,经过马老师从历史角度的点化,我一下子明白了.先来看看中国式教育是怎么教我们浮点数的存储,如下:(大括号下的文字引用别人的文章,地址:http://dqifa.blog.163.com/blog/static/49258365200972111101595/?fromdm&isFromSearchEngine=yes

{ 所有的C/C++编译器都是按照IEEE(国际电子电器工程师协会)制定的IEEE 浮点数表示法来进行运算的。这种结构是一种科学表示法,用符号(正或负)、指数和尾数来表示,底数被确定为2,也就是说是把一个浮点数表示为尾数乘以2的指数次方再加上符号。下面来看一下具体的规格:

 符号位

 指数位

 小数部分

 指数偏移量

 

单精度浮点数

 1 [31]

 8 [30-23]

 23 [22-00]

 127

 

双精度浮点数

 1 [63]

 11 [62-52]

 52 [51-00]

 1023

我们以单精度浮点数来说明:

指数是8位,可表达的范围是0255

而对应的实际的指数是-127+128

这里特殊说明,-127+128这两个数据在IEEE当中是保留的用作多种用途的

-127表示的数字是0

128和其他位数组合表示多种意义,最典型的就是NAN状态

从存储结构和算法上来讲,doublefloat是一样的,不一样的地方仅仅是float32位的,double64位的,所以double能存储更高的精度任何数据在内存中都是以二进制(1或着0)顺序存储的,每一个1或着0被称为1位,而在x86CPU上一个字节是8位。比如一个16位(2字节)的short int型变量的值是1156,那么它的二进制表达就是:00000100 10000100。由于Intel CPU的架构是Little Endian(请参数机算机原理相关知识),所以它是按字节倒序存储的,那么就因该是这样:10000100 00000100,这就是定点数1156在内存中的结构.

我们先不考虑逆序存储的问题,先按照顺序的来讲,最后再把他们翻过来就行了。

 

 

以上为中国式教育,最大的特点是直接公式,没有原因,没有历史,只有结果.下面看看马老师的教学方式,简单易懂,引入历史,

美国电气和电子工程师协会(IEEE)是一个国际性的电子技术与信息科学工程师的协会,是世界上最大的专业技术组织之一(成员人数),拥有来自175个国家的36万会员(2005)。那么在这之前计算机存储浮点数是什么标准呢?为什么要有电子工程师协会这个组织存在,它是在什么历史背景下诞生的?浮点数的存储标准(IEEE745)又是在什么历史背景下诞生的?

IEEE只是个协会,定标准的协会,计算机的书中我们常看到的,以前没有标准,都是个人的喜好,或个个公司的喜好,按自己喜好把浮点数存储在计算机中,这样浮点数存储就没有办法沟通,每个公司用的都不一样,所以为了统一标准IEEE出现了,IEEE有很多标准其中浮点数存储的标准叫IEEE754,哈哈,只是加了个编号,以后看IEEE加数字,就知道是这个协会产生的一种为决解计算机沟通产生的一个标准,比如IEEE802标准就是局域网的国际标准,那么这个IEEE之前浮点数存储是怎么样的呢?下面举例说明一下:

如:浮点数12345678.375(10)如果不按IEEE754标准存入计算机中是怎么样的?按逻辑来理解先要存储整数部分12345678和小数部分375,然后再存储小数点在第几位.这样12345678转成16进制就是bc614e,需要3个字节。把小数部分转16进制就是0177,要2个字节,记录小数点在第几位要1个字节,那个一共用掉了6个字节,当然在IEEE745标准这前还有很多标准, 存储浮点数的方式都不一样.这时产生了一个问题,整数部分和小数部分占用的字节不确字,所以存储同一个数据占用的字节数都不一亲,这样我们自己来个标准,统一用

1.2345678375*10^7,这样占用的字节数就一样了.于是IEEE组织就出现了给存储浮点数定了一个准标叫IEEE745,标准如下:

类型存储位数偏移值
数符(s)阶码(E)尾数(M)总位数十六进制十进制
短实数(Single,Float)1位8位23位32位0x7FH+127
长实数(Double)1位11 位52位64位0x3FFH+1023
临时实数(延伸双精确度,不常用)1位15位64位80位0x3FFFH+16383

-25.625存储到4个字节中, 先转二进制

-11001.101

指数形式:

-1.1001101 * 2^4

 

127+4 = 131……10000011

  1      10000011  (1)1001101 0000000000000000

符号位   指数位(8)  小数位  小数位(补齐)

                    ┗━━━━数据位━━━━┛                   

1100 0001 1100 1101 0000 0000 0000 0000

 C    1    C    D    0    0    0    0

00 00 cd c1

 

总结一下:中国式教育只是简单的把公式告诉我们,没有让我们思考公式产生的原因.所以学计算机由历史引入会让我们学的更好,之前的文章,有很多人反对马老师的观点,也有很多人支持这个观点,反对观点的人是站在用户的角度去看问题,如果从用户的角度去看这个问题,那么马老师说的观点就是垃圾,如果站在一个要把计算机学的十分精通的人的角度去看这个问题,那么马老师说的观点就是精华了.

转载于:https://www.cnblogs.com/baihelianzi/archive/2011/08/18/2144947.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值