[英]How to calculate number of mantissa bits?
我想计算 float 和 double 的尾数位数。 我知道这些数字应该是 23 和 52,但我必须在我的程序中计算它。
您可以使用在标题<cfloat>
中定义的常量
例如,参见 FLT_MANT_DIG。
尾数位数不明确:可能是
通常,以 IEEE 浮点格式存储的尾数不包括所有常规非零数所隐含的初始1
。 因此,表示中的位数比真实位数少一。
您可以通过不同的方式为二进制浮点格式计算此数字:
FLT_MANT_BITS
、 DBL_MANT_BITS
和LDBL_MANT_BITS
。 该值是尾数位的真实数量。<float.h>
中定义的FLT_EPSILON
的直接计算中得出位数: FLT_EPSILON
是最小的浮点值,因此1.0f + FLT_EPSILON
与1.0f
不同。 尾数的真实数量是1 - log(FLT_EPSILON) / log(2)
。 相同的公式可用于其他浮点格式。这是一个测试实用程序:
#include <float.h>
#include <math.h>
#include <stdio.h>
int main(void) {
int n;
float f = 1.0;
for (n = 0; 1.0f + f != 1.0f; n++) {
f /= 2;
}
#ifdef FLT_MANT_BITS
printf("#define FLT_MANT_BITS %d\n", FLT_MANT_BITS);
#endif
#ifdef FLT_EPSILON
printf("1 - log(FLT_EPSILON)/log(2) = %g\n", 1 - log(FLT_EPSILON) / log(2));
#endif
printf("Mantissa bits for float: %d\n", n);
double d = 1.0;
for (n = 0; 1.0 + d != 1.0; n++) {
d /= 2;
}
#ifdef DBL_MANT_BITS
printf("#define DBL_MANT_BITS %d\n", DBL_MANT_BITS);
#endif
#ifdef DBL_EPSILON
printf("1 - log(DBL_EPSILON)/log(2) = %g\n", 1 - log(DBL_EPSILON) / log(2));
#endif
printf("Mantissa bits for double: %d\n", n);
long double ld = 1.0;
for (n = 0; 1.0 + ld != 1.0; n++) {
ld /= 2;
}
#ifdef LDBL_MANT_BITS
printf("#define LDBL_MANT_BITS %d\n", LDBL_MANT_BITS);
#endif
#ifdef LDBL_EPSILON
printf("1 - log(LDBL_EPSILON)/log(2) = %g\n", 1 - log(LDBL_EPSILON) / log(2));
#endif
printf("Mantissa bits for long double: %d\n", n);
return 0;
}
我的笔记本电脑上的输出:
1 - log(FLT_EPSILON)/log(2) = 24
Mantissa bits for float: 24
1 - log(DBL_EPSILON)/log(2) = 53
Mantissa bits for double: 53
1 - log(LDBL_EPSILON)/log(2) = 64
Mantissa bits for long double: 64
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.