Floating point 如何判断一个数字是否可以精确表示为32位IEEE浮点?

Floating point 如何判断一个数字是否可以精确表示为32位IEEE浮点?,floating-point,binary,bit,cpu-architecture,ieee-754,Floating Point,Binary,Bit,Cpu Architecture,Ieee 754,这是我课本上的一项任务 假设一台计算机的字长为32位,按以下方式划分: 符号位为1位 9位偏置指数 23位尾数部分 2^-1+2^-29是这台计算机上的机器号吗? 我该如何确定这一点 abs(-1)-(29))大于尾数宽度,因此不需要,这将需要太多有效数字(尾数位) 如果用非指数二进制点表示法写出它们,如0.10000…0001,则两个数字之间的差距将大于尾数。(类似于小数点,但它是二进制位值,所以我们称之为二进制点。) i、 e.对于2-1,2-29小于1 ulp。(ULP=最后一位的单位=尾

这是我课本上的一项任务

假设一台计算机的字长为32位,按以下方式划分:
符号位为1位
9位偏置指数
23位尾数部分

2^-1+2^-29是这台计算机上的机器号吗? 我该如何确定这一点

abs(-1)-(29))
大于尾数宽度,因此不需要,这将需要太多有效数字(尾数位)

如果用非指数二进制点表示法写出它们,如
0.10000…0001
,则两个数字之间的差距将大于尾数。(类似于小数点,但它是二进制位值,所以我们称之为二进制点。)

i、 e.对于2-1,2-29小于1 ulp。(ULP=最后一位的单位=尾数的低位。)

二进制浮点数可以表示固定数量的(二进制)“有效数字”,等于尾数宽度,而不考虑指数。()


请注意,存储的尾数宽度仅为23位,但有一个隐式的前导1(用于规范化数字)

所以1+2-23是完全可以表示的。i、 e1 ulp相对于1.0=
2^-23
。(相关信息:与C FLT_EPSILON一样,EPSILON是1.0的半个ulp,因此二进制32浮点值为2^-24。这是您可以添加到
1.0
中的最大值,并且仍然可以将结果舍入到
1.0
,即添加到
1.0
时可以得到的最大舍入误差)

请注意,许多现代文档使用“有效位”而不是“尾数”,因为它在数学上更为正确。

abs(-1)-(29))
大于尾数宽度,因此不需要,这将需要太多有效数字(尾数位)

如果用非指数二进制点表示法写出它们,如
0.10000…0001
,则两个数字之间的差距将大于尾数。(类似于小数点,但它是二进制位值,所以我们称之为二进制点。)

i、 e.对于2-1,2-29小于1 ulp。(ULP=最后一位的单位=尾数的低位。)

二进制浮点数可以表示固定数量的(二进制)“有效数字”,等于尾数宽度,而不考虑指数。()


请注意,存储的尾数宽度仅为23位,但有一个隐式的前导1(用于规范化数字)

所以1+2-23是完全可以表示的。i、 e1 ulp相对于1.0=
2^-23
。(相关信息:与C FLT_EPSILON一样,EPSILON是1.0的半个ulp,因此二进制32浮点值为2^-24。这是您可以添加到
1.0
中的最大值,并且仍然可以将结果舍入到
1.0
,即添加到
1.0
时可以得到的最大舍入误差)

请注意,许多现代文档使用“有效位”而不是“尾数”,因为它在数学上更为正确

2^-1+2^-29是这台计算机上的机器号吗?
我该如何确定这一点

假设假设格式使用的是base 2(未指定),那么2-1和2-29都可以精确表示为2的小幂。让我们称它们为
a_1
a_29
,并假设
a_1>a_29>0

“符号位为1位, 9位有偏指数, 23位尾数部分类似于。如果它遵循所有这些规则(包括次法线),那么不同值之间的任何减法都不会导致0。这对于下一步很重要

设置和/差
acc=a_1+/-a_29
acc_1=acc-a_1
。如果
acc\u 1==+/-a\u 29
,那么
acc
是精确表示的,否则
acc
不是精确的和/差
a\u 1+/-a\u 29
,只是四舍五入的结果

在2-1和2-29的情况下,由于“23位尾数部分”太窄,无法准确编码2-1-29的相对差异,因此差异不能准确表示。我们需要大约“27-28位尾数部分”来完成

2^-1+2^-29是这台计算机上的机器号吗?
我该如何确定这一点

假设假设格式使用的是base 2(未指定),那么2-1和2-29都可以精确表示为2的小幂。让我们称它们为
a_1
a_29
,并假设
a_1>a_29>0

“符号位为1位, 9位有偏指数, 23位尾数部分类似于。如果它遵循所有这些规则(包括次法线),那么不同值之间的任何减法都不会导致0。这对于下一步很重要

设置和/差
acc=a_1+/-a_29
acc_1=acc-a_1
。如果
acc\u 1==+/-a\u 29
,那么
acc
是精确表示的,否则
acc
不是精确的和/差
a\u 1+/-a\u 29
,只是四舍五入的结果


在2-1和2-29的情况下,由于“23位尾数部分”太窄,无法准确编码2-1-29的相对差异,因此差异不能准确表示。我们需要大约“27-28位尾数部分”才能做到这一点。

关于下溢的有趣点,但问题是关于加法而不是减法。
-
符号在指数中。(这个问题实际上不是关于FP加法,但在这种情况下,输入都是可精确表示的,因此可以这样处理。当然,假设二进制浮点;在我编辑之前,问题被标记为,IEEE二进制浮点比IEEE十进制浮点更常见。)@彼得考德斯对求和/求差计算的修正答案。对整个流程没有太大的改变。关于下溢的有趣点,但问题是关于加法而不是减法。
-
符号在指数中。(好吧,问题不是关于FP加法,但在这种情况下,输入都是精确的抑制