CSAPP | Floating Point

CSAPP | Floating Point

b i b_i bi b i − 1 b_{i-1} bi1 b 2 b_2 b2 b 1 b_1 b1 b 0 b_0 b0 b − 1 b_{-1} b1 b − 2 b_{-2} b2 b − 3 b_{-3} b3 b − j b_{-j} bj
S = ∑ k = − j i b k × 2 k S=\sum_{k=-j}^{i}b_k\times2^k S=k=jibk×2k

IEEE Standard 754

浮点数表示方法

v = ( − 1 ) s × M × 2 E v=(-1)^s\times M\times 2^E v=(1)s×M×2E
符号位 Sign: 0 表示正,1 表示负。
尾数 Significand M: ∈ [ 1.0 , 2.0 ) \in [1.0, 2.0) [1.0,2.0)
阶码 exponent: E 对浮点数加权,权重为 2 的 E 次幂。

浮点数分为三个域:符号、阶码、 尾数
sign (1 bit) | exponent (e bit) | fraction(or mantissa) (f bit)

sign 直接编码符号 s
k 位阶码字段 e x p = e k − 1 . . . e 1 e 0 exp=e_{k-1}...e_1e_0 exp=ek1...e1e0 编码了 E(但是不等同于 E)
n 位小数字段 f r a c = f n − 1 . . . f 1 f 0 frac=f_{n-1}...f_1f_0 frac=fn1...f1f0 编码了 M(但是不等同于 M)

规格化值

1.exp ≠ \neq = 000…0 and exp ≠ \neq = 111…1

2.阶码字段以 biased(偏置) 形式表示,E = Exp - Bias,Exp 为无符号数,Exp 的范围为 00000001 ∼ 11111110 0000 0001 \sim 1111 1110 0000000111111110 1 ∼ 254 1 \sim 254 1254。Bias 为 2 k − 1 − 1 2^{k-1}-1 2k11,由此产生的指数取值范围,单精度为 − 126 ∼ + 127 -126\sim +127 126+127,双精度为 − 1022 ∼ + 1023 -1022\sim +1023 1022+1023

3.小数字段 frac 被解释为描述小数值 f, f ∈ [ 0 , 1 ) f \in [0,1) f[0,1), 二进制表示为 0. f n − 1 . . . f 1 f 0 0.f_{n-1}...f_1f_0 0.fn1...f1f0。尾数定义为 M = 1 + f M=1+f M=1+f。可以把 M 看作为二进制表示为 1. f n − 1 . . . f 1 f 0 1.f_{n-1}...f_1f_0 1.fn1...f1f0

4.对于尾数,我们可以“抛掉”小数点左边的 1,只看右侧。M 最小的时候 frac = 000…0(M = 1.0),M 最大的时候 frac = 111…1(M = 2.0 - ε \varepsilon ε,也就是 1.111…1)
IEEE754浮点数阶码为什么需要偏置bias

Single precision: 32 bits

Double Precision: 64 bits

Example

对于浮点数 F = 15213.0
1521 3 10 15213_{10} 1521310
= 1110110110110 1 2 = 1110 1101 1011 01_2 =111011011011012
= 1.110110110110 1 2 × 2 13 =1.110 1101 1011 01_2 \times 2^{13} =1.11011011011012×213

Significand

M = 1.110110110110 1 2 M=1.110 1101 1011 01_2 M=1.11011011011012
f r a c = 1101101101101000000000 0 2 frac=110 1101 1011 01 0000 0000 00_2 frac=110110110110100000000002(23 bits)

Exponent

E = 13 E = 13 E=13 因为 2 的幂是 13
B i a s = 127 Bias=127 Bias=127 因为 float 单精度表示,k = 8, B i a s = 2 k − 1 − 1 = 2 7 − 1 = 127 Bias=2^{k-1}-1=2^7-1=127 Bias=2k11=271=127
E x p = 140 = 1000110 0 2 = E + B i a s Exp=140=10001100_2=E + Bias Exp=140=100011002=E+Bias

Result

0    10001100   1101101101101000000000 0 2 0~~10001100~110 1101 1011 01 0000 0000 00_2 0  10001100 110110110110100000000002
从左到右分别为 s exp frac

非规格化值

如果使用规格化数,总是使 M ≥ 1 M \geq 1 M1,就无法表示 0。而 +0.0 的浮点表示位模式为全 0。符号位为 0,阶码字段为 0,是一个非规格化值。然而此时 M = f = 0。如果符号位为 1,那么就是 -0.0。

1.exp = 000…0 成立

2.E = 1 - Bias

3.M = 0.xxx…x

特殊的值

e x p = 111...1 , f r a c = 000...0 exp = 111...1, frac=000...0 exp=111...1,frac=000...0 代表无穷大
e x p = 111...1 , f r a c ≠ 000...0 exp=111...1,frac\neq 000...0 exp=111...1,frac=000...0 N a N ( n o t   a   n u m b e r ) NaN(not~a~number) NaN(not a number) E.g. sqrt(-1)

Visualization: Floating Point Encodings


对于 8 位浮点数:
k = 4 , B i a s = 2 3 − 1 = 7 , E = 1 − B i a s = 1 − 7 = − 6 k = 4, Bias=2^3-1=7,E = 1-Bias=1-7=-6 k=4,Bias=231=7,E=1Bias=17=6

对于非规格化值:
E = 1 − B i a s E=1-Bias E=1Bias
0 0000 000,M = 0, 0 × 2 − 6 = 0 0 \times 2^{-6} = 0 0×26=0
0 0000 001, M = 1 × 2 − 3 = 1 8 , 1 8 × 1 2 6 = 1 512 M=1\times 2^{-3}=\frac{1}{8}, \frac{1}{8} \times \frac{1}{2^6} = \frac{1}{512} M=1×23=81,81×261=5121

0 0000 111 为非规格化值所能表示的最大值
对于规格化值:
E = e x p − B i a s E=exp-Bias E=expBias
0 0001 000 此时 e x p = 1 , E = e x p − B i a s = 1 − 7 = − 6 , f r a c = 000 , M = 1.000 exp=1, E=exp-Bias=1-7=-6,frac=000,M=1.000 exp=1,E=expBias=17=6,frac=000,M=1.000,这是最小的规格化值。

Rounding

IEEE 现在有四种舍入方式,分别为 向零舍入、向下舍入、向上舍入、就近舍入(默认)

如何理解就近舍入?

当为中间数,要向最近的偶数(舍入后保留的最低有效位是偶数)舍入。

对于 7.8950000,9 是一个奇数,所以向上舍入。
对于 7.8850000,8 是一个偶数,所以向下舍入。

二进制数截断


对于 10.1110 0 2 10.11100_2 10.111002 如果直接截断,则为 10.11 是个奇数,所以应该加上 0.001

乘法

( ( − 1 ) s 1 × M 1 × 2 E 1 ) × ( ( − 1 ) s 2 × M 2 × 2 E 2 ) ((-1)^{s1}\times M1 \times 2^{E1}) \times ((-1)^{s2}\times M2 \times 2^{E2}) ((1)s1×M1×2E1)×((1)s2×M2×2E2)
S i g n   s : s 1 ⊕ s 2 Sign~s: s1 \oplus s2 Sign s:s1s2
S i g n i f i c a n d   M : M 1 × M 2 Significand~M:M1 \times M2 Significand M:M1×M2
E x p o n e n t   E : E 1 + E 2 Exponent~E: E1 + E2 Exponent E:E1+E2

如果 M ≥ \geq 2,则须有右移位同时增加指数,来让尾数在 1 和 2 之间。
如果 E 超出范围,则会溢出到无穷大。
如果 M 有太多位,则需要就近舍入。

(3.14 + 1e10) - 1e10 = 0
3.14 + (1e10 - 1e10) = 3.14
1e20 ∗ * (1e20 - 1e20) = 0.0

Questions

int x = ...;
float f = ...;
double d = ...;

x == (int)(float) x; // False, 在浮点数的 frac 区域没有足够的位来表示 int,会舍入
x == (int)(double) x; // True
f == (float)(double) f; // True
d == (double)(float) d; // False
f == -(-f); // True
2 / 3 == 2 / 3.0 // False, 2/3=0, 2/3.0 是一个浮点数
d < 0.0 -> ((d * 2) < 0.0) // Yes, 即使 d * 2 溢出到负无穷大,也是小于 0
d > f -> -f > -d // Yes
d * d >= 0.0 // Yes
(d + f) - d == f // No

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/587608.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何批量复制多个文件到多个目录中(批量复制文件,多对多文件高效操作的方法)

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 现在开始说具体操作 1、首先&#xff0c;我准备了3个文件夹和两个可爱的图片&#xff1a; 当然&#xff0c;在实际使用的时候肯定不止这些&#xff0c;我这…

升级 Vite 5 出现警告 The CJS build of Vite‘s Node API is deprecated

错误描述 vue3-element-admin 项目将Vite4 升级至 Vite5 后,项目运行出现如下警告: The CJS build of Vites Node API is deprecated. See https://vitejs.dev/guide/troubleshooting.html#vite-cjs-node-api-deprecated for more details.图片 问题原因 Vite 官方弃用 C…

怎么用微信小程序实现远程控制台球室

怎么用微信小程序实现远程控制台球室呢&#xff1f; 本文描述了使用微信小程序调用HTTP接口&#xff0c;实现控制台球室&#xff0c;控制球台上方的照明灯&#xff0c;单台设备可控制多张球台的照明灯。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 …

【源码解析】深入Pandas的心脏DataFrame 含十大功能、源码实现与编程知识点

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

Arcpy开发记录

一.GDB数据库相关 1.单独的shape更新时&#xff0c;不会有限制&#xff0c;数据会自动截取 2.在GDB下&#xff0c;使用UpdateCursor更新字段时&#xff0c;填入的数据长度必须与字段长度要求一致&#xff0c;否则报错&#xff1a; 二.arcpy.da.UpdateCursor相关 updateRow后关…

【无线通信开发应用】nRF905数据手册深度解读

希望通过两个stm32、两个nRF905无线通信模块、串口来实现两机通信。具体功能为&#xff1a; 板子A、B分别包含一个stm32单片机和一个nRF905无线模块&#xff0c;欲实现板子A、B之间的通信。 其中&#xff0c;PC端串口助手可向板子A的stm32发送字符‘A’控制板子B上的LED亮灯&am…

Linux migrate_type初步探索

1、基础知识 我们都知道Linux内存组织管理结构架构&#xff0c;顶层是struct pglist_data&#xff0c;然后再到struct zone&#xff0c;最后是struct page。大概的管理结构是这样的&#xff1a; 根据物理内存的地址范围可划分不同的zone&#xff0c;每个zone里的内存由buddy…

【redis】Redis数据类型(三)List类型

目录 List类型介绍特点 List数据结构附&#xff1a;3.2以前的版本(介绍一下压缩列表和双向链表)压缩列表ZipList双向链表LinkedList 常用命令lpush示例 lpushx示例 rpush示例 rpushx示例 LPOP示例 RPOP示例 BLPOP非阻塞行为阻塞行为相同的 key 被多个客户端同时阻塞在 MULTI/EX…

【类型商店】字符字符串(上)

啊&#xff0c;哈喽&#xff0c;小伙伴们大家好。我是#Y清墨&#xff0c;今天呐&#xff0c;我要介绍的是字符与字符串。 导语 在我之前发的[算法材料包]C数字拆分里有提及到.size()和length()和strlen(),想看更多内容请别划走&#xff01; 一.论字符 &#xff08;1&#xff…

口袋实验室--使用AD2高效调试IIC、UART、SPI等低速接口

目录 1. 简介 2. 调试过程 2.1 简要步骤 2.2 Si5338 寄存器配置流程 2.3 AD2的基本配置 2.4 检查Si5338状态 2.5 配置Si5338寄存器 2.6 保存Si5338寄存器 3. 总结 1. 简介 使用Digilent Analog Discovery 2进行调试不仅提升了工作效率&#xff0c;而且极大地简化了常…

Golang | Leetcode Golang题解之第60题排列序列

题目&#xff1a; 题解&#xff1a; func getPermutation(n int, k int) string {factorial : make([]int, n)factorial[0] 1for i : 1; i < n; i {factorial[i] factorial[i - 1] * i}k--ans : ""valid : make([]int, n 1)for i : 0; i < len(valid); i {…

2024年第二十一届 五一杯 (C题)大学生数学建模挑战赛|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 CS团队倾注了大量时间和心血&#xff0c;深入挖掘解决方案。通…

pyinstaller打包pytorch和transformers程序

记录使用pyinstaller打包含有pytorch和transformers库的程序时遇到的问题和解决方法。 环境和版本信息 操作系统&#xff1a;Windows 11 Python&#xff1a;3.10.12 pyinstaller&#xff1a;5.13.0 torch&#xff1a;2.2.2 transformers&#xff1a;4.40.1 打包过程和问…

【进收藏夹吃灰系列】算法学习指南

文章目录 [toc]分治算法 个人主页&#xff1a;丷从心 系列专栏&#xff1a;进收藏夹吃灰系列 分治算法 博客标题博客url【分治算法】【Python实现】Hanoi塔问题https://blog.csdn.net/from__2024_04_11/article/details/138093461?spm1001.2014.3001.5502

Mysql-黑马

Mysql-黑马 编写规范&#xff1a;## 一级1. 二级三级 1.Mysql概述 数据库概念mysql数据仓库 cmd启动和停止 net start mysql180 net stop mysql180备注&#xff1a;其中的mysql180是服务名 客户端连接 远程连接数据仓库 -h 主机号 -P端口号 mysql [-h 127.0.0.1] [-P 33…

CSDN如何在个人主页开启自定义模块|微信公众号

目前只有下面三种身份才具有这个功能。 VIP博客专家企业博客 栏目内容不知道怎么写HTML的&#xff0c;可以联系我帮你添加

15.Blender Eevee和Cycles渲染引擎对比

初步介绍 Eevee是实时渲染的引擎&#xff0c;会省略一些解算方式&#xff0c;尤其对光线和阴影 Cycles会考虑这些因素&#xff0c;所以会对光线和阴影的表达更加真实&#xff0c;有一个实时光线追踪的功能 Cycles渲染完之后&#xff0c;每移动一次画面&#xff0c;都会重新渲染…

【工程记录】Python爬虫入门记录(Requests BeautifulSoup)

目录 写在前面1. 环境配置2. 获取网页数据3. 解析网页数据4. 提取所需数据4.1 简单提取4.2 多级索引提取 5. 常见问题 写在前面 仅作个人学习与记录用。主要整理使用Requests和BeautifulSoup库的简单爬虫方法。在进行数据爬取时&#xff0c;请确保遵守相关法律法规和网站的服务…

git revert的使用

由于某种原因我们需要撤销掉之前某一次的修改&#xff0c;但是这个修改已经提交&#xff0c;并且后面又经历了好几轮的提交。可能如下这种情况&#xff1a; 那么此时使用git revert再合适不过啦。git revert ${commit_id}就可以将指定commit id的修改撤销&#xff0c;然后提交…

Java从菜鸟到高手①

目录 1.数据类型 2.定义变量 2.1.编码方式 2.2.布尔型变量boolean 2.3.隐式类型转化和强制类型转化 2.4类型提升 3.字符串类型 4.运算符 4.1.取余 4.2. &#xff0c;- 4.3逻辑运算&& || &#xff01; 4.4.位运算 4.5.条件运算符 1.数据类型 Java中&#…