IEEE754

IEEE 754标准解读

简介

IEEE 754 标准 是IEEE二进位浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)的标准编号,它规定了浮点数在计算机当中的存储方式以及算术标准等。

存储方式

计算机中数据均是按二进制的方式存储的,浮点数的存储也是如此。但是由于浮点数的特殊性,无法采用整数的补码存储方式,浮点数需要有特定的存储方式。总的来说,一个浮点数可以分为3部分存储:

  • sign(符号)
  • exponent(指数)
  • fraction(尾数)

举例: 0.00101(2)=1.01×23
(2)表示二进制,上式中小数0.00101可以存储为3部分
①sign: +
②exponent: (-3)
③fraction: 01
为什么不存储小数点前面的数呢?
key:浮点数之所以叫浮点数,是因为小数点的位置是不确定的。
如上面的 0.00101(2) 可以写成 1.01×23 ,也可以写成 10.1×24 ,而如果这台机器这样存,那台机器那样存,这可怎么计算呢?
因此,存储是统一化成科学记数法,即小数点之前一定是1。
化成科学记数法之后最高位均为1,于是便将1省略,只存储小数点之后的尾数,这种机制使同样的内存空间可以存储更大范围的数。

单精度和双精度所占字节数不一样,他们②③部分的宽度自然不一样(如图分别为float和double)
float
double
sign
符号位在计算机中的存储是非常容易的,因为符号只有正负两种情况,因此需一个bit便可存储,0代表正,1代表负

exponent
指数是一个整数,一般来说整数会采用补码存储,但是补码存储不能方便地进行浮点数的比较以及运算(原因参见wikipedia )

于是exponent采用biased exponent = exponent + bias
实际计算机中存储的是经过偏移的指数(biased exponent),即在原来指数的基础上加上一个数(float是加上127,double是1023),这个经过偏移的指数一定非负。
举例:单精度浮点数,指数为-3,偏移过后为124,于是便存储为01111100

fraction
直接将fraction转化为二进制后存入计算机

规约与非规约(normalized & denormalized numbers)

我们先来计算按如此方式存储所能表示的最小的正数和最大的负数
±1.0 × 2^minexp
即fraction部分以及exponent部分均为最小,1是隐藏存储的,但是可不可以更小呢?
为了满足对精度的需求,使能表示的数更加地接近0,IEEE754标准引入了规约(normalized)与非规约(denormalized)的概念。

normalized number
标准规定规约型的浮点数,最高位隐藏存储为1,偏移后的指数b_exp范围为0<b_exp<2^e - 1. e指的是exponent部分的宽度。例如float指数宽度为8,能表示的最小指数为0-127 = -127。fraction部分直接存储

denormalized number
规定非规约的浮点数,最高位隐藏存储0,偏移后的指数b_exp为0,fraction部分直接存储(但是不能为0,原因往下看)。
你也许会想既然规约和非规约都是隐藏存储最高位,那么计算机怎么知道隐藏的是1还是0呢?这个很简单,注意规约和非规约的b_exp范围是有区别的,计算机会根据这个进行判断。

特殊值

标准规定了一些特殊值(零,无穷,非数字)的存储方式
如果 指数 是0 并且 小数部分 是0, 这个数±0 (和符号位相关,这就是上文说的原因)
如果 指数 = 2^e - 1并且 小数部分 是0, 这个数是 ±无穷大 (同样和符号位相关)
如果 指数 = 2^e - 1并且 小数部分 非0, 这个数表示为不是一个数(NaN).

总结一下,列个表

formbiased exponentfraction
zero00
denormalized0not 0
normalized0<b_exp<2^e - 1
±infinity (±∞)2^e - 10
NaN2^e - 1not 0

参考资料:百度百科、Wikipedia

不精确存储

浮点数存在不精确存储的现象
这种现象发生于一下几种情况之下:

  • 有效位数过长
  • 无法表示某些数

第一种很容易理解,以double类型为例,存储位数只有52(如果加上省略的那位是53位),如果存储的数有效位数大于53,则无法准确存储
第二种情况,举个例子吧,0.3就不能化成二进制

大一freshman,如发现错误之处望指出,感谢!

04-25
### 关于IEEE 754浮点数标准及其实现 IEEE 754 是一种广泛使用的浮点数表示标准,旨在提供一致性和可移植性来处理计算机中的实数值计算。该标准定义了单精度(32位)、双精度(64位)以及扩展精度的格式,并规定了如何编码这些数值以支持精确的科学和工程应用。 #### IEEE 754 的核心特性 1. **特殊值的支持** 根据 IEEE 754 定义,指数字段全为 `0` 或全为 `1` 被保留用于表示特殊情况,例如零、无穷大和 NaN(Not-a-Number)。这种设计允许更灵活地处理异常情况[^2]。 2. **舍入模式** IEEE 754 支持多种舍入模式,其中最常用的是“四舍五入到最近偶数”。为了严格遵循此模式并考虑溢出与下溢条件的影响,在某些情况下可以通过编程风格强制操作数写入内存之间完成浮点运算,尽管这会带来性能损失[^1]。 3. **硬件支持差异** 当前个人电脑通常通过 SSE 单元执行基于 IEEE 754 类型的操作,简化了兼容性的实现;然而许多嵌入式系统并未配备此类单元,因此需依赖软件层面模拟完整的 IEEE 行为[^1]。 4. **数据格式描述** IEEE 754 将每种格式视为一组数值表达方式及其编码方法集合。这意味着除了基本结构外还涉及具体存储形式的设计考量[^4]。 #### 实现细节探讨 对于开发者而言理解其实现有助于优化程序表现或者调试复杂算法行为: - 如果希望获得几乎完全忠实于 IEEE-754 双精度计算的结果,则可以采用限制精度的方法同时调整编译选项使得每次中间结果都被保存至内存从而减少寄存器内部额外精度带来的偏差影响。 - 针对不同平台环境选择合适的解决方案非常重要——现代桌面级处理器普遍具备良好支持而部分资源受限设备可能需要更多努力才能达到预期效果。 以下是简单展示如何利用 C++ 来创建符合 IEEE 754 规范的一个函数例子: ```cpp #include <cmath> #include <limits> bool is_ieee_754_compliant(double value) { const double max_double = std::numeric_limits<double>::max(); const double min_positive_normal = std::numeric_limits<double>::min(); if (value == 0 || !std::isfinite(value)) { return true; } if ((fabs(value) >= min_positive_normal && fabs(value) <= max_double)) { return true; } // Handle subnormal numbers here... return false; } ``` 以上代码片段仅作为概念验证用途展示了判断给定值是否处于正常范围内的逻辑框架。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值