C语言中的浮点范围
根据,C中的浮点数据类型范围为1.2E-38到3.4E+38,精度为6位小数 然而,在我看来,值1.2E-38需要更多的精度来表示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的链接对此进行了解释,但让您了解每一位是如何影响最终结果的。我认为你玩弄它比解释或链接到
我的推理有什么错?简单回答,浮点数使用指数来表示数字,而不是像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