Я хочу рассчитать количество бит мантиссы в поплавке и двойном. Я знаю, что эти цифры должны быть 23 и 52, но я должен рассчитать его в своей программе.Как рассчитать количество бит мантиссы?
ответ
Есть константы, которые можно использовать определенные в заголовке <cfloat>
См FLT_MANT_DIG, например.
Не забудьте взять FLT_RADIX во внимание, работающий на компьютере, который не использует плавающие базы-2! –
Существует неоднозначность в числа битов мантиссы: это может быть
- количество битов, необходимых для представления значения с плавающей запятой.
- количество бит, хранящихся в представлении с плавающей запятой.
Как правило, мантисса, которые хранятся в формате 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 или '53' для двойного. Счет должен отражать математику значения, которое имеет 53-битное значение, даже если с типичными форматами FP, только 52 явно сохранены (1 подразумевается). (C++, некий 'DBL_MANT_DIG' -> 53 – chux
Я согласен, это понятие немного запутанно, более подробное объяснение было необходимо. Я придумал более простой расчет. – chqrlie
- 1. 32-битное представление мантиссы 2455.1152
- 2. Бит-представление с использованием избытка-3 и мантиссы
- 3. Как отобразить переменную длину мантиссы
- 4. Как рассчитать бит флаг в javascript?
- 5. Как рассчитать общее количество часов
- 6. Как рассчитать количество переменных POST
- 7. Как рассчитать количество логических процессоров?
- 8. Как рассчитать общее количество просмотров?
- 9. Как рассчитать количество разделов n?
- 10. Как рассчитать количество параметров AlexNet?
- 11. Как рассчитать количество рекурсивных вызовов?
- 12. Как рассчитать общее количество часов?
- 13. Tableau: Как рассчитать количество дней
- 14. Установить количество бит
- 15. Упаковать произвольное количество бит
- 16. Как найти длину мантиссы на конкретной машине?
- 17. Рассчитать количество итераций
- 18. Рассчитать оставшееся количество дней
- 19. Рассчитать количество possibilites
- 20. Рассчитать количество операций C
- 21. Рассчитать количество текста
- 22. Рассчитать количество пирамид
- 23. SAS - рассчитать количество поправок
- 24. Рассчитать количество смежных часов
- 25. Как рассчитать nof бит 0 в битовой начинке?
- 26. Рассчитать количество операций
- 27. Django, рассчитать количество запросов?
- 28. Как вычислить общее количество бит в объекте BitSet?
- 29. Виртуальная память - рассчитать количество страниц таблицы страниц
- 30. Как рассчитать, сколько бит необходимо для представления любого отрицательного значения?
Зачем вам нужно, чтобы вычислить его в вашей программе? –
Возможно, вы можете начать [здесь] (https://en.wikipedia.org/wiki/Floating_point) – Nard
@ EdHeal при приблизительном предположении, потому что это то, о чем просил профессор/TA OP. –