作者:qingheqianyenft | 来源:互联网 | 2022-12-06 11:47
我试图理解浮点格式的整数表示.
由于IEEE浮点格式对于尾数只有23位,因此我希望任何大于1 <<22的整数只是近似表示.这不是我在g ++中观察到的
两个下面的cout打印相同的值33554432.
由于尾数部分是负责精度的部分,我们如何能够准确地表示(存储)需要超过23位的精确数字.
void floating_point_precision(){
cout<
作为基于以下答案的后续,为什么以下代码不执行"不等于",即使fp,i的打印都不同.
void floating_point_precision(){
cout<
Keith Thomps..
8
的确,IEEE浮点只有有限数量的尾数位.如果有23个尾数位,则它可以精确地表示2 23个不同的整数值.
但由于浮点单独存储一个二次幂指数,它可以(受限于指数范围)代表这两个23值中的任何一个乘以 2 的幂.
33554432
正好是2 25,所以它只需要一个尾数位来准确表示它(加上一个表示乘以2的幂的二进制指数).它的二进制表示是10000000000000000000000000
26位但只有1 位有效位.(嗯,实际上它们都很重要,但你明白了.)
你会发现,它的邻国整数值33554431
,并33554433
不能完全以32位代表float
.(但它们可以用64位表示double
.)
更一般地,类型的连续可表示值之间的float
差异随着值的大小而变化.在我的系统上(大多数系统使用IEEE格式,但标准不要求),这个程序:
#include
#include
#include
void show(float f) {
std::cout <
产生这个输出:
0.999999940395355224609375
1
1.00000011920928955078125
8388607.5
8388608
8388609
16777215
16777216
16777218
1073741760
1073741824
1073741952
它示出了即时前导和后继,在式float
中,数字1,2的23,2 24,2 30.正如您所看到的,对于较大的数字,间隙会变大,每个幂为2时,间隙会增加一倍.
你会得到类似的结果,但间隙较小,类型double
或long double
.
1> Keith Thomps..:
的确,IEEE浮点只有有限数量的尾数位.如果有23个尾数位,则它可以精确地表示2 23个不同的整数值.
但由于浮点单独存储一个二次幂指数,它可以(受限于指数范围)代表这两个23值中的任何一个乘以 2 的幂.
33554432
正好是2 25,所以它只需要一个尾数位来准确表示它(加上一个表示乘以2的幂的二进制指数).它的二进制表示是10000000000000000000000000
26位但只有1 位有效位.(嗯,实际上它们都很重要,但你明白了.)
你会发现,它的邻国整数值33554431
,并33554433
不能完全以32位代表float
.(但它们可以用64位表示double
.)
更一般地,类型的连续可表示值之间的float
差异随着值的大小而变化.在我的系统上(大多数系统使用IEEE格式,但标准不要求),这个程序:
#include
#include
#include
void show(float f) {
std::cout <
产生这个输出:
0.999999940395355224609375
1
1.00000011920928955078125
8388607.5
8388608
8388609
16777215
16777216
16777218
1073741760
1073741824
1073741952
它示出了即时前导和后继,在式float
中,数字1,2的23,2 24,2 30.正如您所看到的,对于较大的数字,间隙会变大,每个幂为2时,间隙会增加一倍.
你会得到类似的结果,但间隙较小,类型double
或long double
.