gpt4 book ai didi

c++ - 整数在 float 中的精确表示

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:30 29 4
gpt4 key购买 nike

我正在尝试理解浮点格式的整数表示。

由于 IEEE 浮点格式只有 23 位的尾数,我希望任何大于 1<<22 的整数都只是一个近似表示。这不是我在 g++ 中观察到的

下面的两个 cout 打印相同的值 33554432。

由于尾​​数部分是负责精度的部分,我们如何能够表示(存储)需要超过 23 位才能准确存储的确切数字。

void floating_point_precision(){
cout<< setprecision(10);
float fp = (1<<25);
cout<< fp <<endl;
cout<< (1<<25) <<endl;
}

作为基于以下答案的后续行动,为什么即使 fp,i 的打印不同,以下代码也不会执行“不等于”。

void floating_point_precision(){
cout<< setprecision(10);
float fp = ((1<<25)+1);
cout<< fp <<endl;
int i = ((1<<25)+1) ;
cout<< i <<endl;
if(i != fp)
cout<< "Not equal" <<endl;
}

最佳答案

的确,IEEE float 只有有限的尾数位。如果有 23 个尾数位,那么它可以精确表示 223 个不同的整数值。

但是由于 float 单独存储一个二次方的指数,它可以(在有限的指数范围内)精确地表示这 223 个值中的任何一个乘以两个

33554432正好是 225,所以它只需要一个尾数位来准确表示它(加上一个表示乘以 2 的幂的二进制指数)。它的二进制表示是10000000000000000000000000 ,它有 26 位,但只有 1 个 significant 位。 (好吧,实际上它们都很重要,但你明白了。)

你会发现它的相邻整数值3355443133554433 不能在 32 位中精确表示 float . (但它们可以用 64 位 double 表示。)

更一般地说,float 类型的连续可表示值之间的差异值的大小而变化。在我的系统上(大多数系统使用 IEEE 格式,但标准不要求),这个程序:

#include <iostream>
#include <iomanip>
#include <cmath>

void show(float f) {
std::cout << std::nextafterf(f, 0.0) << "\n"
<< f << "\n"
<< std::nextafterf(f, f*2) << "\n";
putchar('\n');
}

int main(void) {
std::cout << std::setprecision(24);

show(1);
show(1<<23);
show(1<<24);
show(1<<30);
}

产生这个输出:

0.999999940395355224609375
1
1.00000011920928955078125

8388607.5
8388608
8388609

16777215
16777216
16777218

1073741760
1073741824
1073741952

它以 float 类型显示直接前任和后继者, 数字 1、223、224 和 230。如您所见,数字越大,差距越大,差距在每次 2 的幂处加倍。

你会得到类似的结果,但差距更小,类型为 doublelong double .

关于c++ - 整数在 float 中的精确表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52086887/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com