首页 > 编程语言 >程序员数学之-IEEE754规范

程序员数学之-IEEE754规范

时间:2024-01-21 19:22:06浏览次数:36  
标签:float16 val 浮点数 IEEE754 程序员 数学 127 float32

1 定点数与浮点数

在现实生活中,不仅要有整数,还需要小数,计算机怎么表示小数呢?有两种方式:定点数与浮点数

定点数(Fixed Point Number):

顾名思义,小数点位置固定,例如常见的Qm.n 表示法,共需1(符号位)+ m (整数位) + n (小数位)bit位来表示数据,如Q7,Q15,Q31 等数据类型。
其优点是:计算速度快;
缺点是:表示范围小,不利于同时表达特别大或者特别小的数。

浮点数(Floating Point Number):

使用科学计数法表示一个小数,优点是表示范围广、精度较高,但计算速度相对复杂。

2 IEEE754规范

2.1 浮点存储格式

IEEE754规范规定了float16、float32(即float)、float64(即double)其存储格式如下,分为三部分表示:符号位(S,蓝色块),阶码(E,绿色块),尾数(M,红色块):

半精度浮点 float16

float16

单精度浮点 float32

双精度浮点float64

2.2 规格数、非规格数与特殊数

根据阶码E区分,IEEE754规范规定了三种状态:

  1. normal number(规格数)

    特点是:阶码E不为0和且不为全1

    以float32为例,其形式为:

    其值的大小为:
    $$
    V=(-1)s\times(1.M)\times2
    $$
    对于float16(bias = 15),float32(bias = 127),float64(bias = 1023)。

规格数不能表示0和非常靠近0的数。

例如:对于一个float32:-3.456 该怎么表示呢?

符号位:为-1,所以s=1,3.456=(1 + 0.728 ) * 2,所以 M = 0.728 E = 1 + 127 = 128

使用工具验算 IEEE-754 Floating Point Converter (h-schmidt.net)

可见与我们想法一致:

  1. subnormal number(非规格数)

    特点是:阶码E=0, 表示0以及0附近的值)

    其值的大小为(注意,标准规定非规格数指数为1-bias),无论尾数M为多少,都是一个比较接近0的值:
    $$
    V=(-1)s\times(0.M)\times2
    $$

  2. non-number(特殊数)

    特点是:阶码E为全1,包括正负Inf,非数值NAN)

    无穷大Inf:

​ 非数值 NAN(Not A Number):

这几种状态在数轴上的分布如下:

2.3 浮点数表示范围与精度

范围 精度
float16 (-2 * 2^15, 2 * 2^15) 也即:(-65536,65536) 1/(2^10) 即 3-4位有效数字
float32 (-2 * 2^127, 2 * 2^127)也即:(-3.4e+38, 3.4e+38) 1/(2^23) 即 6~7位有效数字
float64 (-2 * 2^1023, 2 * 2^1023)也即:(-1.79e+308, 1.79e+308) 1/(2^52) 即 15~16位有效数字

3 浮点数之间相互转换

以float16与float32的相互转换为例:

有时需要将浮点数打印输出,%f可打印单精度浮点型数据(float),%lf可打印双精度浮点型数据(double)。

在C语言中,打印半精度浮点数(float16)可能会有一些挑战,因为C语言标准库通常不直接支持这种类型,这时需要将其强制转换为float32打印,代码中我们可以类似如下操作:

float16_t val = 1.5;
printf("val = %f\r\n", (float32_t)val); // 将float16_t 强制转换为float32_t,通过%f打印

强转看起来比较简单,但实际上在这个过程中,float16 的符号位、指数位和尾数位将按照浮点数格式的规则进行扩展,类似如下操作:

float32_t f16Tof32(float16_t halfFloat) {
    union {
        uint32_t Uint32;
        float32_t F32;
    } val;
    val.Uint32 = *((uint32_t *)(&halfFloat));
    // S + E + M
    val.Uint32 = ((val.Uint32 & 0x8000) << 16) |
                 (((((val.Uint32 >> 10) & 0x1f) - 15 + 127) & 0xff) << 23) |
                 ((val.Uint32 & 0x03FF) << 13);
 
    return val.F32;
}

4 快速计算2的指数次幂的原理

快速计算2的指数幂,正是利用IEEE754的浮点结构,如计算2的x次幂:
$$
2x=(-1)0\times(1.0)\times2^{((x + 127)-127)}
$$

s = 0, M = 0, E = x+127

其转换代码如下:

uint32_t power2(uint32_t x) {
    union {
        uint32_t Uint32;
        float_t F32;
    } val;
    val.Uint32 = (127 + x) << 23;
    return (uint32_t)val.F32;
}

// 同样的,我们也可以快速的计算log2
uint32_t log2(float_t y) {
    union {
        uint32_t Uint32;
        float_t F32;
    } val;
    val.F32 = y;
    return ((val.Uint32) >> 23) - 127;
}

参考:

  1. IEEE754规范: 四, 非规格数, ±infinity, NaN - 知乎 (zhihu.com)
  2. 快速浮点数exp算法_快速exp-CSDN博客

标签:float16,val,浮点数,IEEE754,程序员,数学,127,float32
From: https://www.cnblogs.com/sureZ-learning/p/17978194

相关文章

  • 对程序员来说cpu是什么
    程序是指示计算机每一步动作的一组指令程序由指令和数据构成机器语言是cpu可以直接识别并使用的语言正在运行的程序储存在存中,内存中,用来表示命令和数据存储位置的数值叫做内存地址。cpu负责程序的解释和运行Cpu是具有各种功能的寄存器的集合体cpU内部由寄存器、控制器、运......
  • 程序是怎样跑起来的_第一章-对程序员来说CPU是什么
    通过对第一章的学习,我了解了大体上CPU可以说是电脑的"大脑",即中央处理器。从功能来看可以分为寄存器,控制器,运算器和时钟。在这四个部分中,寄存器是最值得程序员注意的。总的来说,CPU对程序员来讲是寄存器的集合体。值得一提的是,我们使用java等高级语言编写的程序是被编译器转换成机......
  • 书里写爱因斯坦的数学考试考了1分
    像小学时候,书里写爱因斯坦的数学考试考了1分,但是后来仍然成为了伟大的科学家。 殊不知德国的教育分数,是6分制,1分是优秀,6分是最差的。所以爱因斯坦小时候的数学成绩,是很好的,各位同学想要未来成为伟大的科学家,一定要学好数学。除了爱因斯坦,还有著名的发明家爱迪生。他7岁......
  • 常用 $ \LaTeX $ 数学公式(持续更新)
    Updateon2022.11.12:修正了一处小错误希望这份东西能尽量帮助大家,节省在\(\LaTeX\)公式大全中寻找的时间,欢迎在评论区提出建议。如果您有需求,例如添加某一部分的公式,可私信号主。插入公式$你要插入的公式$这是普通插入(即紧跟随文字插入)$$你要插入的公式(最好是比较大的)$$......
  • 第一章——对程序员来说CPU是什么
    这本书的第一章主要讲解的是CPU。那对于程序员来说CPU到底是什么呢?这一章便给出了答案。cpu是什么?CPU是CentralProcessingUnit(中央处理器)的缩写,也就是相当于计算机的大脑。它由寄存器、控制器、运算器、时钟构成,各部分之间由电流信号相互连通。CPU是寄存器的集合体,我们也需要......
  • 积性函数学习笔记
    积性函数定义积性函数:\(f(x)\)满足\(\forall\gcd(a,b)=1,f(ab)=f(a)f(b)\)若没有\(\gcd(a,b)=1\)的性质,则为完全积性函数。性质性质1:\(f(x),g(x)\)是积性函数\(\implies\)\(f\timesg\)是积性函数,\(f\divg\)是积性函数证明略。性质2:狄利克雷(Dirichlet)卷积\(......
  • 商丘师范大学 数学与统计学院
    数学与统计学院现设有数学与应用数学、统计学、金融数学三个本科专业。目前在校生1300多人。一、数学与应用数学(国家级特色专业,师范类,四年制本科)本专业旨在培养掌握数学科学的基本理论与基本方法,具备运用数学知识、使用计算机解决实际问题的能力,受到科学研究的初步训练,能在科......
  • Unity 程序员UI编码规范
    今天给大家分享UnityUI开发相关的一些编码和规范,有了这些指导规范,帮助你的项目获得更好的性能,少走弯路。UnityGUI(也被称为UGUI)经常是项目性能问题的来源。考虑使用多分辨率和宽高比大部分情况下,我们一套UI,能基本全部适配好,UnityUI让建立一个可以适应不同分辨率和宽高比屏幕调......
  • 数学和CNN里面的卷积和互相关
    卷积和互相关nndl上CNN这章的互相关讲的比较晦涩,简单辨析一下书上的互相关A.1数学意义上的卷积就是将卷积核进行翻转之后再进行我们熟悉CNN上的卷积运算同时互相关就是不将卷积核翻转直接CNN卷积运算说到这里就明白了,做如下总结\(数学上的互相关=CNN卷积\)$数学上的卷积......
  • 《算法竞赛》07 组合数学
    二项式定理\((a+b)^n=\sum_{i=0}^n\binomnia^ib^{n-i}\)。杨辉三角每个数对应一个组合数。卢卡斯定理\(m\)为质数时\(\binomnm\bmodp=\binom{n\bmodp}{m\bmodp}\cdot\binom{\lfloor\fracnp\rfloor}{\lfloor\fracmp\rfloor}\bmodp\)。有时候结合递归,对\(\binom{......