繁体   English   中英

如何计算尾数位数?

[英]How to calculate number of mantissa bits?

我想计算 float 和 double 的尾数位数。 我知道这些数字应该是 23 和 52,但我必须在我的程序中计算它。

您可以使用在标题<cfloat>中定义的常量

例如,参见 FLT_MANT_DIG。

尾数位数不明确:可能是

  • 表示浮点值所需的位数。
  • 存储到浮点表示中的位数。

通常,以 IEEE 浮点格式存储的尾数不包括所有常规非零数所隐含的初始1 因此,表示中的位数比真实位数少一。

您可以通过不同的方式为二进制浮点格式计算此数字:

  • 一些系统定义了清单内容FLT_MANT_BITSDBL_MANT_BITSLDBL_MANT_BITS 该值是尾数位的真实数量。
  • 您可以从涉及<float.h>中定义的FLT_EPSILON的直接计算中得出位数: FLT_EPSILON是最小的浮点值,因此1.0f + FLT_EPSILON1.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM