与float数据类型混淆

confusion with float datatype

本文关键字:数据类型 float      更新时间:2023-10-16

我了解整数范围,但我不知道float是如何工作的

范围3.4 e-38至3.4 e+38(7位有效数字)

浮动范围为0.0000000000000000000000000000034至34000000000000000000000000000000000000000000

7位有效数字是如何计算的?

IEEE754单精度浮点数的有效位长度为23位。这意味着您有24个二进制精度数字(23个有效位加上隐含的前导1)。将24个二进制数字(224可能的总数)转换为等效的十进制数字:

log10(224)=7.2247199

将结果向下四舍五入得到7位小数精度。

相比之下,双精度浮点数字具有52位有效位。这意味着53位二进制数字的精度。在基数10:

log10(253)=15.9545898

或者大约16位小数精度。

7位数字表示数字的精度。

例如,可以表示123000000000,因为只有3个有效的精度数字(1.23 x 10^11)。但123000000010无法表示,因为它涉及11位精度(1.230000001 x 10^11)。

0.00000000000000001234567和1234567000000000000000000,但不是123415678000

Float具有:符号的1位(1个负数,0个正数)表示为移位-127的无符号字节的指数的8位(0x00和0xFF是特殊情况)23表示尾数,尾数的每一位计数为2^(-bitIndex)所以比特23的值是0.5,比特22是0.25,比特21是0.125,依此类推

最终数值为(1+尾数)*(2^指数)

因此,如果你想表示0.1015625,你必须将数字分解为尾数和指数,你必须找到乘以你的数字的二次方,得到一个形式为1的数字在这种情况下为16。0.1015625*16=1.625。所以指数是16。16+127为10001111现在我们必须在尾数中表示0.625。0.625等于0.5+0.125所以我们的号码是0 10001111 1010000000000000000

在这种情况下,我们是幸运的,数字是精确的。如果你试图对0.12这样的数字进行编码,你会发现你只得到0.1199999(random_number)这样的数字,所以如果你用非常接近的数字进行计算,7位数的精度只是一个警告。您还必须考虑特殊情况,指数为1、尾数为0的数字表示无穷大。指数为1且尾数不为零的数字不代表数字NaN。

浮点由两部分组成:介于0和1之间的"有效位"s(约为小数点后7位),以及指数e,该指数为2的乘方。

表示(1+s)*2e

在C++中,浮点是使用IEEE 754格式以32位表示的浮点整数。在这种格式中,1位用于符号(正或负),8位用于指数,有效位包含在24位中,但由于指数的编码,其中只有23位被显式存储。有效位对有效数字进行编码。使用24位存储,浮点值可以有大约7个有效数字。

请参阅http://en.wikipedia.org/wiki/Single_precision_floating-point_format有关如何用计算机表示浮点值的更多信息。

浮点数以科学记数法的形式存储,但以二进制形式存储。例如,

  • 2011=二进制11111 011011=1.11111011011×210
  • 0.75=二进制0.11=1.1&倍;2-1

在IEEE 754中,(单精度)float有24个有效二进制数字,可以表示与24 log102&近似值相同的信息量;7.22位小数。

如何计算7位有效数字

看看你是怎么写的,nroux:3.4e-38到3.4e+38。你使用了科学记数法,将每个数字分成一个有效位(3.4)和一个指数(-38或+38)。计算机对浮点数字的处理基本上是一样的,将有效位和指数存储为表示浮点数字的内存块中两个独立的、固定大小的部分。