谈谈浮点数的IEEE标准——未完成
2010-02-21 08:51
232 查看
IEEE754标准是现在最通用的二进制算术运算标准,它被用于Sun,DEC,HP,IBM工作站以及所有的个人计算机。IEEE算术运算包括两类浮点数:单精度(float型,32位字长)和双精度(double型,64位字长)。除此之外,还有一个可选的扩展精度格式(long double,80位字长)。
规范化的浮点数可以表示为
![](http://hi.csdn.net/attachment/201002/27/4027224_1267236376P444.gif)
其中f为小数或称为尾数,而e为指数。注意,这两个数都是以二进制表示的。
其中f的取值范围为
![](http://hi.csdn.net/attachment/201002/27/4027224_1267236853lzGZ.gif)
gsl中提供了一些函数来把一个浮点数按照规范化的格式显示出来:
调用这两个函数时,需要声明: #include <gsl/gsl_ieee_utils.h>
举例而言,如果我们需要看看float型和double型的0.1的标准格式,可以使用如下代码:
输出结果分别为:
fx= 1.10011001100110011001101*2^-4
dx= 1.1001100110011001100110011001100110011001100110011010*2^-4
如果你觉得ieee标准的0.1表示有些奇怪,那么就该进一步了解一下规范化浮点数在计算机中的存储格式:
单精度与双精度浮点数的存储格式如下表:
以双精度格式为例分析之:
由于它的小数位有52位,即252 *f必须是[0,252)区间内的整数。f的有限取值,造成了浮点数精度上的限制。
而该格式的指数位共有11位,因此指数位可以表示[0,2047]区间的整数。但是需要注意的是,这里的指数位e' 并不等于指数e。实际上,指数区间[0,2047]上的两个极值0与2047被保留用于表示浮点数的例外值(后文将加以介绍);此外,为了能够兼顾在浮点数表示范围的上限与下限,规定:
![](http://hi.csdn.net/attachment/201002/28/4027224_12673227083dwt.gif)
e的有限取值造成了浮点数范围上的限制。
所以对于0.1而言,我们如果仔细写出它的二进制展开即有:
![](http://hi.csdn.net/attachment/201003/11/4027224_1268310649ky0T.gif)
如果耐心计算,对于double型的0.1,有:
f=(0.1001100110011001100110011001100110011001100110011010)2
而e=-4+1023=1019
这就不难理解gsl_ieee_printf_double(&dx)函数返回的结果。
规范化的浮点数可以表示为
![](http://hi.csdn.net/attachment/201002/27/4027224_1267236376P444.gif)
其中f为小数或称为尾数,而e为指数。注意,这两个数都是以二进制表示的。
其中f的取值范围为
![](http://hi.csdn.net/attachment/201002/27/4027224_1267236853lzGZ.gif)
gsl中提供了一些函数来把一个浮点数按照规范化的格式显示出来:
void gsl_ieee_printf_float (const float * x)//将单精度浮点数按照规范化方式输出 void gsl_ieee_printf_double (const double * x)//将双精度浮点数按照规范化方式输出
调用这两个函数时,需要声明: #include <gsl/gsl_ieee_utils.h>
举例而言,如果我们需要看看float型和double型的0.1的标准格式,可以使用如下代码:
#include <stdio.h> #include <gsl/gsl_ieee_utils.h> void main (void) { float fx = 0.1; double dx = 0.1; printf (" fx="); gsl_ieee_printf_float(&fx); printf ("/n"); printf (" dx="); gsl_ieee_printf_double(&dx); printf ("/n"); }
输出结果分别为:
fx= 1.10011001100110011001101*2^-4
dx= 1.1001100110011001100110011001100110011001100110011010*2^-4
如果你觉得ieee标准的0.1表示有些奇怪,那么就该进一步了解一下规范化浮点数在计算机中的存储格式:
单精度与双精度浮点数的存储格式如下表:
格式 | 长度 | 符号位 | 指数位e’ | 小数位f |
---|---|---|---|---|
float | 32位 | 1位 | 8位 | 23位 |
double | 64位 | 1位 | 11位 | 52位 |
由于它的小数位有52位,即252 *f必须是[0,252)区间内的整数。f的有限取值,造成了浮点数精度上的限制。
而该格式的指数位共有11位,因此指数位可以表示[0,2047]区间的整数。但是需要注意的是,这里的指数位e' 并不等于指数e。实际上,指数区间[0,2047]上的两个极值0与2047被保留用于表示浮点数的例外值(后文将加以介绍);此外,为了能够兼顾在浮点数表示范围的上限与下限,规定:
![](http://hi.csdn.net/attachment/201002/28/4027224_12673227083dwt.gif)
e的有限取值造成了浮点数范围上的限制。
所以对于0.1而言,我们如果仔细写出它的二进制展开即有:
![](http://hi.csdn.net/attachment/201003/11/4027224_1268310649ky0T.gif)
如果耐心计算,对于double型的0.1,有:
f=(0.1001100110011001100110011001100110011001100110011010)2
而e=-4+1023=1019
这就不难理解gsl_ieee_printf_double(&dx)函数返回的结果。
相关文章推荐
- 谈谈浮点数的IEEE标准——未完成
- IEEE 754二进制浮点数算术标准
- 浮点数的二进制表示(IEEE 754标准)
- IEEE 754-1985 浮点数标准文档
- 二进制浮点数算术标准 IEEE 754
- IEEE二进制浮点数算术标准(IEEE 754)
- IEEE 754 的浮点数格式标准(一)
- 解读IEEE标准754:浮点数表示
- (转)C#中浮点数依IEEE-754标准转二进制串
- UNIX 标准化 --ISO C标准 & IEEE POSIX 标准 &Single Unix Specification(SUS)
- IEEE 754标准中,阶的偏置值为什么是127,而不是128?
- UNIX 标准化 --ISO C标准 & IEEE POSIX 标准 &Single Unix Specification(SUS)
- IEEE 754浮点数表示标准
- IEEE Floating Point Standard (IEEE754浮点数表示法标准)
- 浮点数的运算原理--IEEE 754
- IEC,IEEE,GB,GB/T,Q各类标准的抬头含义
- IEEE系列规范标准
- 门电路图对照表——国标、IEEE、标准符号对照表
- IEEE 802.11 标准列表
- IEEE 802.6标准和分布队列双绞线