2016-03-05 4 views
-1

Я хочу рассчитать количество бит мантиссы в поплавке и двойном. Я знаю, что эти цифры должны быть 23 и 52, но я должен рассчитать его в своей программе.Как рассчитать количество бит мантиссы?

+6

Зачем вам нужно, чтобы вычислить его в вашей программе? –

+0

Возможно, вы можете начать [здесь] (https://en.wikipedia.org/wiki/Floating_point) – Nard

+0

@ EdHeal при приблизительном предположении, потому что это то, о чем просил профессор/TA OP. –

ответ

5

Есть константы, которые можно использовать определенные в заголовке <cfloat>

См FLT_MANT_DIG, например.

+5

Не забудьте взять FLT_RADIX во внимание, работающий на компьютере, который не использует плавающие базы-2! –

3

Существует неоднозначность в числа битов мантиссы: это может быть

  • количество битов, необходимых для представления значения с плавающей запятой.
  • количество бит, хранящихся в представлении с плавающей запятой.

Как правило, мантисса, которые хранятся в формате IEEE с плавающей точкой не включает в себя начальную 1, который подразумеваемая для всех регулярных ненулевых чисел. Поэтому количество бит в представлении меньше, чем истинное количество бит.

Вы можете вычислить это число для двоичных форматов с плавающей запятой по-разному:

  • некоторых системы определяют манифест contants FLT_MANT_BITS, DBL_MANT_BITS и LDBL_MANT_BITS. Значение - истинное количество бит мантиссы.
  • вы можете получить число битов из прямого вычисления с участием FLT_EPSILON, определенный в <float.h>: 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

«число биттов мантиссы», хотя и не определено _ точно, должно быть +1 или '53' для двойного. Счет должен отражать математику значения, которое имеет 53-битное значение, даже если с типичными форматами FP, только 52 явно сохранены (1 подразумевается). (C++, некий 'DBL_MANT_DIG' -> 53 – chux

+1

Я согласен, это понятие немного запутанно, более подробное объяснение было необходимо. Я придумал более простой расчет. – chqrlie

Смежные вопросы