2016-03-05 55 views
-1

我想計算浮點數和雙精度的尾數位數。 我知道這些數字應該是23和52,但我必須在我的程序中計算它。如何計算尾數位數?

+6

爲什麼你需要計算它在你的計劃? –

+0

也許你可以開始[這裏](https://en.wikipedia.org/wiki/Floating_point) – Nard

+0

@EdHeal粗略猜測,因爲這是OP的prof/TA所要求的。 –

回答

5

有,你可以在頭<cfloat>

見FLT_MANT_DIG例如使用定義的常量。

+5

只記得考慮FLT_RADIX,以防萬一你可能在不使用base-2浮點的計算機上運行! –

3

有一個在數目個尾數位的歧義:它可以是

  • 來表示浮點值所需的位的數目。
  • 存儲到浮點表示中的位數。

通常情況下,存儲在IEEE浮點格式中的尾數不包含初始的1,它暗示所有規則的非零數字。因此表示中的位數比真實位數少一位。

你可以計算這個數字的二進制浮點格式,以不同的方式:

  • 一些系統定義清單contants FLT_MANT_BITSDBL_MANT_BITSLDBL_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 
+1

「尾數比特數」,儘管不是_precisely_定義的,應該是+1或者53來雙倍。計數應反映具有53位有效位的數值,即使使用典型的FP格式,只有52位明確存儲(1暗示)。 (C++,某些'DBL_MANT_DIG' - > 53 – chux

+1

我同意,這個概念有點混亂,需要更徹底的解釋,我也想到了一個更簡單的計算。 – chqrlie