Нормальные и субнормальные значения
Концепция нормалшованного значения с плавающей запятой играет важную роль, поэтому давайте изучим ее. Для простоты предположим, что основанием системы счисления является 10 (b = FLT_RADIX = 10), а в значащей части числа используется 5 десятичных цифр для значения типа float (р = FLT_MANT_DIG = 5). (Стандарт требует более высокой точности, чем эта, но желание упростить изучение позволяет нам проигнорировать данное требование.) Взгляните на следующие способы представления значения 31.841:
экспонента = 3, значащая часть = .31841 (.31841E3) экспонента = 4, значащая часть = .03184 (.03184Е4) экспонента = 5, значащая часть = .00318 (.00318Е5)
Очевидно, что первый метод будет наиболее точным, поскольку в значащей части присутствуют все пять доступных цифр. Нормализованное ненулевое значение с плавающей запятой — это такое значение, в котором первая цифра в значащей части отличается от нуля, и именно так обычно хранятся значения с плавающей запятой.
Теперь предположим, что минимальная экспонента (FLT_MIN_EXP) установлена в -10. Тогда наименьшее нормализованное значение таково:
экспонента = -10, значащая часть = .10000 (.10000Е-10)
Обычно умножение или деление на 10 означает увеличение или уменьшение экспоненты, но в этом случае деление не может дополнительно уменьшить экспоненту. Однако можно изменить значащую часть, чтобы получить следующее представление:
экспонента = -10, значащая часть = 0.0100 (.01000Е-10)
Такое число будет называться субнормальным, потому что оно не использует полную точность значащей части. Например, деление 0.12343Е-10 на 10 дает .01234Е-10, и одна цифра теряется.
В данном примере 0.1000Е-10 является наименьшим ненулевым нормальным представлением (FLT_MIN), а наименьшим ненулевым субнормальным значением будет 0.00001Е-10 (FLT_TRUE_MIN).
Макросы FLT_HAS_SUBNORM, DBL_HAS_SUBNORM и LDBL_HAS_SUBNORM из float.h характеризуют, каким образом реализация обрабатывает субнормальные значения. Ниже перечислены возможные значения для этих макросов и объяснен их смысл:
-1 неопределимо (непротиворечивой интерпретации не существует)
0 отсутствует (реализация могла бы, например, заменять субнормальные значения нулем)
1 присутствует
906 Приложение Б
Библиотека math.h предлагает средства, в том числе макросы fpclassifyt) и isnormal(), которые позволяют идентифицировать, когда программа генерирует субнормальные значения, таким образом, теряя точность.
Схемы оценки
Макрос FLT_EVAL_METHOD из float.h отражает схему, которую реализация применяет для оценки выражений с плавающей запятой. Возможные варианты описаны ниже:
-1 неопределимо
0 оценка операций и констант в диапазоне и точности их типа
1 оценка операций и констант типов float и double в диапазоне и точности типа double, а операций и констант типа long double в диапазоне и точности типа long double
2 оценка операций и констант всех типов с плавающей запятой в диапазоне и точности типа long double
Реализации разрешено предоставлять дополнительные отрицательные значения для обозначения других вариантов.