C语言中的浮点范围

C语言中的浮点范围,c,types,floating-point,precision,C,Types,Floating Point,Precision,根据,C中的浮点数据类型范围为1.2E-38到3.4E+38,精度为6位小数 然而,在我看来,值1.2E-38需要更多的精度来表示 我的推理有什么错?简单回答,浮点数使用指数来表示数字,而不是像2这样的整数。用户3386109的链接对此进行了解释,但让您了解每一位是如何影响最终结果的。我认为你玩弄它会比解释或链接到维基百科页面更有用。简单回答,浮点数使用指数来表示数字,而不是像2这样的整数。用户3386109的链接对此进行了解释,但让您了解每一位是如何影响最终结果的。我认为你玩弄它比解释或链接到

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

然而,在我看来,值1.2E-38需要更多的精度来表示


我的推理有什么错?

简单回答,浮点数使用指数来表示数字,而不是像2这样的整数。用户3386109的链接对此进行了解释,但让您了解每一位是如何影响最终结果的。我认为你玩弄它会比解释或链接到维基百科页面更有用。

简单回答,浮点数使用指数来表示数字,而不是像2这样的整数。用户3386109的链接对此进行了解释,但让您了解每一位是如何影响最终结果的。我认为你玩弄它比解释或链接到维基百科页面更有用。

浮点精度指的是前导有效数字的数量

对于普通的
浮点数
,它可以被视为具有重要意义的数字


回想一下,浮点数是按对数分布的。从0.1到0.2,从10到20,从0.000001到0.000002,从1000000到2000000,不同的FP数大约相同

请注意,下一个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编号之间的差值通常称为最后一位的单位。正是这种差异,与数字相比,才是“精度”。对于2的每一次幂,这个差是恒定的,然后随着-2的幂的增加,它会加倍

请注意,刚好高于1.0的连续
浮点数的差值为2-23或1.0/8388608或
0.000000119…
。这是
FLT\u EPSILON
的定义。有些人认为是“精确”。C指定最大值为
1E-5
或100000分之一


C没有指定浮点值
的行为与通常使用的完全相同,因此可能会有一些变化。

浮点值中的精度指的是前导有效位数

对于普通的
浮点数
,它可以被视为具有重要意义的数字


回想一下,浮点数是按对数分布的。从0.1到0.2,从10到20,从0.000001到0.000002,从1000000到2000000,不同的FP数大约相同

请注意,下一个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编号之间的差值通常称为最后一位的单位。正是这种差异,与数字相比,才是“精度”。对于2的每一次幂,这个差是恒定的,然后随着-2的幂的增加,它会加倍

请注意,刚好高于1.0的连续
浮点数的差值为2-23或1.0/8388608或
0.000000119…
。这是
FLT\u EPSILON
的定义。有些人认为是“精确”。C指定最大值为
1E-5
或100000分之一


C没有指定浮点值
的行为与通常使用的完全相同,因此可能会有一些变化。

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

这里是0符号位

293990933被称为mantisa

3叫做指数

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


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

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

这里是0符号位

293990933被称为mantisa

3叫做指数

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


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

你有没有想过“浮点”中的“浮点”是什么意思?这意味着您可以表示1.2e-38,精度为小数点后6位。也就是说,不要试图在十进制中考虑二进制浮点。1.2是两个十进制数字。指数与此无关。当你在上面输入时,你用了多少位数来表示1.2E-38?0.000000000000000000012有21位小数,精度有2位小数。别想十进制了,它是二进制格式而不是十进制格式。想想尾数中有多少位不是十进制数字。你有没有想过“浮点”中的“浮点”是什么意思?这意味着您可以表示1.2e-38,精度为小数点后6位。也就是说,不要试图在十进制中考虑二进制浮点。1.2是两个十进制数字。指数与此无关。当你在上面输入时,你用了多少位数来表示1.2E-38?0.000000000000000000012有21位小数,精度有2位小数。别想十进制了,它是二进制格式而不是十进制格式。想想尾数中有多少位不是十进制数字。作为一个更具体的例子,在
float
中,值100/3的最接近表示形式是
33.33333 206…
。如您所见,只有7个最有效的十进制数字是有意义的。请注意,根据您对精度的定义,
float
的精度可以是6位或7位小数。在细节上有相当好的描述。作为一个更具体的例子,
float
中最接近的值100/3表示为
33.3333320