C编程语言中的浮点范围

时间:2016-08-09 21:55:17

标签: c types floating-point precision

根据this link,C中的FLOAT数据类型范围为1.2E-38到3.4E + 38,精度为6位小数。

然而,在我看来,1.2E-38的值要求表示的精度小于6位小数。

我的推理有什么问题?

3 个答案:

答案 0 :(得分:3)

浮点精度指的是前导重要位数。

回想一下,浮点数是以对数方式分布的。 FP值从0.1到0.2在10到20之间,在0.000001到0.000002之间,在1,000,000到2,000,000之间。

请注意,下一个FP编号的数字会在最右边的数字中稍微改变一下。

printf("FLT_MIN  %.*e\n", FLT_DECIMAL_DIG - 1, FLT_MIN);
printf("FLT_MIN+ %.*e\n", FLT_DECIMAL_DIG - 1, nextafterf(FLT_MIN, 1.0));
printf("one      %.*e\n", FLT_DECIMAL_DIG - 1, 1.0);
printf("one+     %.*e\n", FLT_DECIMAL_DIG - 1, nextafterf(1.0, 2.0));
printf("FLT_MIN- %.*e\n", FLT_DECIMAL_DIG - 1, nextafterf(FLT_MAX, 1.0));
printf("FLT_MAX  %.*e\n", FLT_DECIMAL_DIG - 1, FLT_MAX);

输出

FLT_MIN  1.17549435e-38
FLT_MIN+ 1.17549449e-38

one      1.00000000e+00
one+     1.00000012e+00

FLT_MAX- 3.40282326e+38
FLT_MAX  3.40282347e+38

两个连续FP编号之间的差异通常称为单位 - (in-the)-last-place ULP。与“精确度”的数字相比,正是这种差异。 binary32的这个差异对于每个2的幂是恒定的,然后它随着2的幂增加而翻倍。

请注意,1.0以上的连续float数字的差异为2 -23 或1.0 / 8,388,608或0.000000119...。这是FLT_EPSILON的定义。有人认为是“精确”。 C指定 most 这可以是1E-5或1中100,000。

C并未指定float的行为与常用的binary32完全相同,因此需要进行一些修改。

答案 1 :(得分:0)

简短的回答,浮点数使用指数来表示数字,而不是像整数那样2的恭维。 user3386109的链接解释了它,但here is a link to an interactive app让你看到每个位如何影响最终结果。我认为你玩弄它将不仅仅是解释或链接到维基百科页面。

答案 2 :(得分:0)

计算机使用科学计数法存储浮点值。 如果浮点值为293.990933,则科学计数法为0.293990933 * 10 ^ 3

  

这里有0个符号位

     

293990933被称为螳螂

     

3称为指数

保留:对于符号位1二进制数字。 对于螳螂,它可以有24位,其余32位用于指数!

默认情况下,当您使用%f时,它会返回数字的6分之一!