与float数据类型混淆

时间:2011-06-03 00:12:28

标签: c++

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

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

浮动范围为0.000000000000000000000000000000000000003434至34000000000000000000000000000000000000000

如何计算7位有效数字?

8 个答案:

答案 0 :(得分:4)

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

  

log 10 (2 24 )= 7.2247199

舍入该结果会产生7位十进制数字。

要进行比较,双精度浮点数具有52位有效数。这意味着53个二进制数字的精度。在基地10:

  

log 10 (2 53 )= 15.9545898

或大约16位精度的十进制数字。

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

0.00000000000000001234567和1234567000000000000000000但不是123415678000

答案 3 :(得分:2)

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

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

所以如果你想代表0.1015625,你必须分解尾数和指数中的数字来做到这一点,你必须找到两个的第二个幂乘以你的数字给出一个数字形式1.something 在这种情况下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且尾数不为零的数字不表示数字NaN。

答案 4 :(得分:1)

浮点数由两部分组成:“有效数字” s 介于0和1之间,大约为7位小数,指数 e 为您提供它乘以的2的幂。

代表(1 + s)* 2 e

答案 5 :(得分:0)

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

有关如何通过计算机表示浮动的详细信息,请参阅http://en.wikipedia.org/wiki/Single_precision_floating-point_format

答案 6 :(得分:0)

Floating-point个数字以scientific notation的形式存储,但是以二进制形式存储。所以,例如,

  • 2011 =二元11111011011 = 1.1111011011×2 10
  • 0.75 =二进制0.11 = 1.1×2 -1

在IEEE 754中,(单精度)float有24个有效二进制数字,可以表示与24 log 10 2≈7.22十进制数字相同的信息量。

答案 7 :(得分:0)

如何计算7位有效数字?

看看你是如何写出这个范围的,nroux:3.4e-38到3.4e + 38。您使用科学记数法来做到这一点,将每个数字拆分为有效数字(3.4)和指数(-38或+38)。计算机对浮点数基本相同,将有效数和指数存储为表示浮点数的内存块的两个独立的固定大小部分。