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

小女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

 

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

posted @ 2011-08-18 18:27  百合莲子  阅读(4394)  评论(65编辑  收藏  举报