实数如何以二进制形式表示?

时间:2011-01-24 00:08:29

标签: c# binary bit-manipulation

我需要在二进制文件中存储一个包含小数位(即1.5)的数字,问题是当我想读取这个文件时,我不知道如何将字节转换回数字,我知道对于整数,我只需要这样做:byte[0] << 24 | byte[1] << 16 | byte[2] << 8 | byte[3]表示大端形式的Int32。对于一个真实数字,这样做的方法是什么?

3 个答案:

答案 0 :(得分:3)

查看BitConverter课程。它包含将各种基本类型转换为字节数组和从字节数组转换的方法。这样你就不需要知道浮点数是如何用二进制表示的。

如果您确实想知道这一点,我认为floating-point上的维基百科文章是了解它的好地方。

答案 1 :(得分:0)

浮点(实数) 浮点数的编码方案比定点更复杂。基本思想与科学记数法中使用的基本思想相同,其中尾数乘以10加到某个指数。例如,5.4321×106,其中5.4321是尾数,6是指数。科学记数法在代表非常大和非常小的数字时是特殊的。例如:1.2×1050,地球中的原子数,或2.6×10-23,一只乌龟在一秒钟内爬行的距离,与我们银河系的直径相比。请注意,以科学计数法表示的数字是标准化的,因此小数点左侧只有一个非零数字。这是通过根据需要调整指数来实现的。

浮点表示类似于科学记数法,除了所有内容都是在第二个基础上进行,而不是基数为十。虽然使用了几种类似的格式,但最常见的是ANSI / IEEE标准。 754-1985。该标准定义了32位数字的格式,称为单精度,以及64位数字,称为双精度。如图4-2所示,单精度使用的32位被分成三个独立的组:位0到22形成尾数,位23到30形成指数,位31是符号位。这些位通过以下关系形成浮点数v:

术语:( - 1)S,仅表示符号位S对于正数为0,对于负数为1。变量E是由8个指数位表示的0到255之间的数字。从这个数字减去127允许指数项从中运行到。换句话说,指数存储在偏移二进制中,偏移量为127.

尾数M由23位形成为二进制分数。例如,小数部分:2.783,被解释为:2 + 7/10 + 8/100 + 3/1000。二进制分数:1.0101,表示:1 + 0/2 + 1/4 + 0/8 + 1/16。浮点数的标准化方式与科学计数法相同,即小数点左侧只有一个非零数字(在

中称为二进制点)

基地2)。由于基数2中存在的唯一非零数字是1,因此尾数中的前导数字将始终为1,因此不需要存储。删除此冗余允许该数字具有额外的一位精度。 23个存储位,用符号表示:m22,m21,m21,...,m0,根据下式形成尾数:

换句话说,M = 1 + m222-1 + m212-2 + m202-3 ....如果位0到22都是零,则M取值为1。如果位0到22都是1,则M只是两个以下的头发,即2-2-23。

使用这种编码方案,可以表示的最大数字是:±(2-2-23)×2128 =±6.8×1038。同样,可以表示的最小数字是:±1.0×2-127 =±5.9×10-39。 IEEE标准略微缩小了这个范围,以释放分配了特殊含义的位模式。特别是,标准中允许的最大和最小数字是±3.4×1038和?1.2?分别为10-38。释放的位模式允许三种特殊类型的数字:(1)±0定义为所有尾数和指数位为零。 (2)±∞定义为所有尾数位为零,并且所有指数位为1。 (3)一组非常小的非标准化数字在1.2之间? 10-38和?1.4? 10-45。这些是通过消除尾数中的前导数字为1的要求而获得的较低精度数。除了这三个特殊类之外,还有一些未赋予含义的位模式,通常称为NAN(非数字)。

双精度IEEE标准只是为单精度格式添加了更多位。在用于存储双精度数的64位中,位0到51是尾数,位52到62是指数,位63是符号位。如前所述,尾数在1和2之间,即M = 1 + m512-1 + m502-2 + m492-3 .... 11个指数位形成0到2047之间的数字,偏移量为1023,允许指数从2-1023到21024.允许的最大和最小数字是?1.8? 10308和?2.2?分别为10-308。这些是非常大和小数字!找到单精度不足的应用程序非常罕见。你可能永远不会发现双精度限制你想要完成的事情。

对于随机位置的问号表示抱歉。

我无法添加图片,因此请不要介意“看图1”。

来源:http://www.dspguide.com/ch4/3.htm

答案 2 :(得分:-2)

您不能将实数存储为位。告诉计算机数字是有符号还是无符号的数据也告诉它它支持的子整数精度级别。计算机做了一个简单的除法问题。