Ненормальные числа очень близки к нулю. Для субнормального x
, x^2
имеет примерно половину несмещенной экспоненты, а это слишком мало для представления даже субнормального. (Даже если x
было самым большим субнормальным числом, т. Е. nextafter(FLT_MIN, -INF)
. Для любых двух субнормальных чисел ситуация аналогична.
Произведение двух субнормальных чисел всегда полностью уменьшается до + или -0.0.
Результат любой операции всегда должен быть нормализован , если возможно . Единственный раз, когда это невозможно, - когда показатель степени будет слишком мал, тогда у вас будут субнормальные (также известные как денормальные) числа даст вам постепенное истощение, оставив начальные биты мантиссы равными нулю для минимального значения показателя. https://en.wikipedia.org/wiki/Single-precision_floating-point_format в целом довольно хорошо объясняет субнормальные числа.
Это общее правило для плавающей запятой, всегда: форматы IEEE754, такие как binary32 и binary64, не оставляют выбора в том, как представлять любое заданное конечное значение. Кодирование ненулевой экспоненты подразумевает начало 1
в мантиссе, поэтому вы не можете иметь денормализованный float
или double
кроме для субнормального. 80-битный формат расширенной точности x87 имеет все свои мантиссы биты хранятся явно, поэтому можно закодировать число с ненулевой экспонентой, но с ведущими нулями в мантиссе. Однако аппаратное обеспечение может даже считать это недействительным, и вам ни в коем случае не следует этого делать, потому что это означает отбрасывание большего количества бит мантиссы, чем необходимо (если это было умножение). знаки различаются / совпадают соответственно. например, nextafter(FLT_MIN, +INFINITY) - FLT_MIN
отменяет все, кроме самого младшего бита мантиссы (пример «catastrophi c cancellation»), оставляя число слишком маленьким, чтобы его можно было представить как нормализованное число с плавающей запятой.