IEEE 754 浮点数加减运算
小数的十进制和二进制转换
移码
定义:[X]移 = X + 2n ( -2n ≤ X < 2n )
X为真值,n为整数的位数
数值位和X的补码相同,符号位与补码相反
舍入方法
0舍1入
保留4位尾数:
0 00100 -> 0 0010
/*
**0直接舍去
*/
1 00101 -> 1 0011
/*
**1进位
*/
1 11011 -> 1 1110
末位恒置1
保留4位尾数:
0 00100 -> 0 0011
1 00101 -> 1 0011
1 11011 -> 1 1101
IEEE 754
32位单精度
| Sign | 8位阶码 [偏移量为28-1-1 = 127的非标准移码] | 23位尾数 |
|---|
| 真值表达式 | E的取值范围 |
|---|---|
| N = (-1)s × 2E-127 × 1.M | 1到254 |
64位双精度
| Sign | 11位阶码 [偏移量为211-1-1 =1023的非标准移码] | 252位尾数 |
|---|
| 真值表达式 | E的取值范围 |
|---|---|
| N = (-1)s × 2E-1023 × 1.M | 1到2046 |
为了确保浮点数表示的唯一性,约定 0 ≤ M < 1
各字段的含义( 以单精度为例 )
规范浮点数
1 ≤ E ≤ 254
真值表达式:N = (-1)s × 2E-127 × 1.M,尾数部分隐含开头的1
- 最小的正规格化数
| 0 | 0000 0001 | 0000 0000 0000 0000 0000 000 |
|---|
- 最大的正规格化数
| 0 | 1111 1110 | 1111 1111 1111 1111 1111 111 |
|---|
非规范浮点数
E = 0,M ≠ 0
| s | 0000 0000 | ≠ 0 |
|---|
真值表达式:N = (-1)s × 2-126 × 0.M,尾数部分不隐含开头的1
最小的正非规格化数
| s | 0000 0000 | 0000 0000 0000 0000 0000 001 |
|---|
最大的正非规格化数
| s | 0000 0000 | 1111 1111 1111 1111 1111 111 |
|---|
浮点数0
E = 0,M = 0
| s | 0000 0000 | 0000 0000 0000 0000 0000 000 |
|---|
有+0.0和-0.0两种零
无穷大
E全为1(255),M = 0
正无穷大
| 0 | 1111 1111 | 0000 0000 0000 0000 0000 000 |
|---|
负无穷大
| 1 | 1111 1111 | 0000 0000 0000 0000 0000 000 |
|---|
NaN Not a Number
计算sqrt(-1)或∞-∞时会返回NaN
E全为1(255),M ≠ 0
| s | 1111 1111 | ≠ 0 |
|---|
为什么要使用127作为偏移量而不是128

https://stackoverflow.com/questions/8909841/why-does-the-ieee-754-standard-use-a-127-bias
溢出
上溢:阶码大于机器的最大阶码,不能继续运算,一般要进行中断处理
下溢:阶码小于最小阶码,当做零处理,机器可以继续运算
规格化浮点数
当尾数结果为00.0x…x 或 11.1x…x
尾数左移,阶码减1,直到尾数形式为00.1x…x 或 11.0x…x当尾数结果为01.x…x 或 10.x…x
尾数右移,阶码加1,尾数形式变为00.1x…x 或 11.0x…x
阶码加减
设:
AE、BE为阶码,CE为结果阶码
[ AE + BE ]移
= ( AE + BE ) + 127
= ( AE + 127 ) + ( BE + 127 ) - 127
= [ AE ]移 + [ BE ]移 -127
= [ AE ]移 + [ BE ]移 + [ -127 ]补
= [AE]移 + [BE]移 + 129
= ( [AE]移 + [BE]移 + 129 ) mod 28
[ AE - BE ]移
= ( AE - BE ) + 127
= ( AE + 127 ) - ( BE + 127 ) + 127
= [ AE ]移 - [ BE ]移 + 127
= ( [AE]移 - [BE]移 + 127 ) mod 28
浮点数加减
设:
A = 2AE × AM,B = 2BE × BM
AE、BE为阶码,AM、BM为尾数

舍入
右移时:
- 0舍1入
- 末位恒置1
例题
x = 0.5, y = 0.4375, 32位单精度表示,求x + y和x - y
转换为二进制
- 0.5 x 2 = 1.0 取1
0.1 → 1.0 x 2 -1
[x]浮 =
| 0 | 0111 1110 | 0000 0000 0000 0000 0000 000 |
|---|---|---|
| -1 + 127 = 126 |
- 0.4375 x 2 = 0.875 取0
- 0.8750 x 2 = 1.750 取1
- 0.7500 x 2 = 1.500 取1
- 0.5000 x 2 = 1.000 取1
-0.0111 → 1.11 x 2-2
[y]浮 =
| 1 | 0111 1101 | 1100 0000 0000 0000 0000 000 |
|---|---|---|
| -2 + 127 = 125 |
求阶差
(0111 1110 - 0111 1101 + 127)mod 28 = 1
y向x对齐
y = 0.111 x 2-1
[y]浮 =
| 1 | 0111 1110 | 1110 0000 0000 0000 0000 000 |
|---|
尾数加减
| + |
|---|
| 00.0000 0000 0000 0000 0000 000 |
| 00.0010 0000 0000 0000 0000 000 |
| 00.0010 0000 0000 0000 0000 000 |
结果为00.0x…x,左规
得到1.0… x 2-4
结果 = 0.0625
| 0 | 0111 1011 | 0000 0000 0000 0000 0000 000 |
|---|---|---|
| -4 + 127 = 123 |
| - |
|---|
| 00.0000 0000 0000 0000 0000 000 |
| 00.1110 0000 0000 0000 0000 000 |
| 00.1110 0000 0000 0000 0000 000 |
结果 = 0.9345
| 0 | 0111 1110 | 1110 0000 0000 0000 0000 000 |
|---|
IEEE 754 浮点数加减运算的更多相关文章
- IEEE 754 浮点数在计算机中的表示方法
IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用.这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denorma ...
- velocity加减运算注意格式 ,加减号的左右都要有空格
velocity加减运算注意格式 ,加减号的左右都要有空格 #set( $left= $!biz.value - $vMUtils.getReturnMoney($!biz.billBuy) )
- [Swift]LeetCode592. 分数加减运算 | Fraction Addition and Subtraction
Given a string representing an expression of fraction addition and subtraction, you need to return t ...
- C语言中指针变量的加减运算
1.指针变量中存放的是地址值,也就是一个数字地址,例如某指针变量中的值是0x20000000,表示表示此指针变量存放的是内存中位于0x20000000地方的内存地址.指针变量可以加减,但是只能与整型数 ...
- 大整数加减运算的C语言实现
目录 大整数加减运算的C语言实现 一. 问题提出 二. 代码实现 三. 效果验证 大整数加减运算的C语言实现 标签: 大整数加减 C 一. 问题提出 培训老师给出一个题目:用C语言实现一个大整数计算器 ...
- Linux中日期的加减运算
Linux中日期的加减运算 目录 在显示方面 在设定时间方面 时间的加减 正文 date命令本身提供了日期的加减运算. date 可以用来显示或设定系统的日期与时间. 回到顶部 在显示方面 使用者可以 ...
- void *指针的加减运算
1.手工写了一个程序验证void *指针加减运算移动几个字节: //本程序验证空类型指针减1移动几个字节 #include <stdio.h> int main(int argc, cha ...
- Leetcode 592.分数加减运算
分数加减运算 给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果. 这个结果应该是不可约分的分数,即最简分数. 如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分 ...
- C语言中指针的加减运算
参考文章,值得一看 char arr[3]; printf("arr:\n%d\n%d\n%d\n", arr, arr + 1, arr + 2); char *parr[3]; ...
随机推荐
- 堆栈相关的经典题(c++)
1.定义队列 typedef struct node{ int data; struct node * next; }Node; typedef struct linkQueue { Node * f ...
- C++模板使用
C++模板 模板是一种对类型进行参数化的工具: 通常有两种形式:函数模板和类模板: 函数模板针对仅参数类型不同的函数: 例如:Max函数 :求两个数的最大值,我们需要对各种数据类型进行重载,如下 in ...
- javascript(1)简介
点击查看代码 ### javascript 1.JavaScript简介 javascript是一种轻量级的脚本语言,可以部署在多种环境,最常见的部署环境就是浏览器, 脚本语言: 它不具备开发操作系统 ...
- Linux上使用设置printf显示的颜色
我们经常看到别的屏幕五颜六色的很是羡慕,看着很炫是吧.其实我们也可以自己做一个简单的修改,是我们的显示结果也呈现出不同的颜色.shell脚本可能设置的比较多,但是我们平常使用C语言却很少设置它的颜色, ...
- Web GIS 航拍实现的智慧园区数字孪生应用
前言 随着智慧城市建设的不断发展,智慧园区作为智慧城市的先行区,其覆盖区域越来越大,产值越来越集中,对于园区数字化建设和智能化管理的诉求也愈加强烈.园区数字化管理是以实现园区多维度业务数据汇聚.融合. ...
- Spring5框架学习笔记
Spring5学习笔记 介绍: 1.引入相应jar包 导入: ps:网上下载教程: https://repo.spring.io/release/org/springframework/spring/ ...
- go案例:客户管理系统流程 mvc模式 分层设计
下面是一个简要的客服系统,主要是演示分层计.. model : 数据部份: package model import "fmt" //声明一个结构体,表示一个客户信息 type C ...
- Android系统编程入门系列之应用数据文件化保存
应用中关于数据的持久化保存,不管是简单的SharedPreferences还是数据库SQLiteDatabase,本质上都是将数据保存到系统的某种类型的文件中.因此可以直接使用java.io.File ...
- 215 day01_Object类、常用API
day01[Object类.常用API] 主要内容 Object类 Date类 DateFormat类 Calendar类 System类 StringBuilder类 包装类 教学目标 -[ ] 能 ...
- 深入浅出 BPF TCP 拥塞算法实现原理
本文地址:https://www.ebpf.top/post/ebpf_struct_ops 1. 前言 eBPF 的飞轮仍然在快速转动,自从 Linux 内核 5.6 版本支持 eBPF 程序修改 ...