CSAPP-Floating Point

Floating Point

IEEE浮点标准用V = (-1)s x M x 2E表示一个浮点数:

  • 符号sign:s决定符号。负数(s=1),正数(s=0)
  • 尾数significant M是一个二进制小数,范围是1 ~ 2-t,或者0 ~ 1-t。
  • 阶码exponent E的作用对浮点数加权,权重是2的E次幂

在这里插入图片描述

单精度s=1位,exp=8位,frac=23位

双精度s=1位,exp=11位,frac=52位

对浮点数编码进行3个阶段:

  • 单独的符号位s直接编码符号s。
  • k位的阶码字段exp=ek-1…e0编码阶段E。
  • n位小数阶段frac=fn-1…f0编码尾数M

规格化的值

exp的位模式不全是0,也不全是1。阶码字段被解释为以偏置形式表示的有符号整数,阶码的值是E = e - bias,其中e是无符号整数,其位表示ek-10,而bias是一个等于2k-1-1的偏置值。(单精度是27-1=127,双精度是210-1=1023)

frac被解释为小数值f,其中0 <= f < 1,其二进制表示为0.fn-1…f0,尾数M = f + 1。

15213.0浮点数的存储
在这里插入图片描述

#include <stdio.h>
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, size_t len) {
    
    
	size_t i;
	for (i = 0; i < len; ++i) {
    
    
		printf(" %.2x", start[i]);
	}
	printf("\n");
}
int main() {
    
    
	float f = 15213.0f;
	show_bytes((byte_pointer)&f, sizeof(f));
	return 0;
}

output:
00 b4 6d 46

测试机器byte ording是小端模式。
在这里插入图片描述

非规格化的值

阶码域全为0,这种情况阶码值是E = 1 - Bias,而尾数是M = f,也就是小数字段的值不包含开头的1。

规格化的值总是M >= 1,因此不能表示0,非规格化可以表示0和接近0的小数。

扫描二维码关注公众号,回复: 11934447 查看本文章

特殊值

当阶码域全为1,小数域全为0,得到的值是无穷,s=1时为负无穷,s=0时为正无穷。

当阶码域全为1,小数域不全为0,结果是Nan(Not a Number)表示非实数,sqrt(-1)的结果是nan

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/WxqHUT/article/details/106062161