Существует ли стандартный способ определения мантиссы двойного числа?
Вы готовы принять решение для Linux, но вы утверждаете, что заголовок ieee754.h
glibc делаетне соответствует вашим потребностям, поэтому я пришел к выводу, что проблема, которую вы пытаетесь решить, заключается не в извлечении или передаче самих битов, поскольку union ieee_double
этого заголовка даст вам возможность сделать это.
Я прочитал "мантисса "как нечто отличное от" количества бит мантиссы ", поэтому я прихожу к выводу, что DBL_MANT_DIG
из float.h
тоже не то, что вы ищете.
Единственная другая вещь, которую яможно думать о том, что вы можете иметь в виду значение значимого (мантиссы) в соответствии со стандартной моделью с плавающей запятой:
v = ( знак) * значимое и * основание показатель степени
Функция frexp()
в стандарте языка C, начиная с C99, служит этой цели. 1 Он разделяет double
iк показателю степени (из 2) и значению, представленному как double
.Для конечного ненулевого ввода абсолютное значение результата находится в полуоткрытом интервале [0,5, 1).
Пример :
#include <math.h>
#include <stdio.h>
void print_parts(double d) {
int exp;
double significand = frexp(d, &exp);
printf("%e = %f * 2^%d\n", d, significand, exp);
}
Примеры выходных данных :
7.256300e + 16 = 0.503507 * 2 ^ 571.200000e-03 = 0,614400 * 2 ^ -9-0.000000e + 00 = -0.000000 * 2 ^ 0
Обратите внимание, что хотя примерная функция не печатает достаточно десятичных цифр для точной передачи значений, сама frexp()
является точной, не подлежит никакомуошибки округления.
1 Технически, frexp()
служит цели , при условии, что FLT_RADIX
расширяется до 2. Это хорошо определено в любом случае, но если ваше представление double
использует другое основание, то результат frexp()
, хотя он и четко определен, вероятно, не тот, который вы ищете.