Кроме того, одним из часто пропускаемых признаков числа с плавающей запятой являются денормализованные числа.
Это числа, которые имеют минимальный показатель степени, но не вписываются в диапазон 0,5-1.
Эти числа ниже , чем FLT_MIN для числа с плавающей запятой, и DBL_MIN для значения типа double.
Распространенной ошибкой при использовании порога является сравнение двух значений или использование FLT_MIN / DBL_MIN в качестве предела.
Например, это может привести к нелогичному результату (если вы не знаете о ненормативной лексике):
bool areDifferent(float a, float b) {
if (a == b) return false; // Or also: if ((a - b) == FLT_MIN)
return true;
}
// What is the output of areDifferent(val, val + FLT_MIN * 0.5f) ?
// true, not false, even if adding half the "minimum value".
Денормали также обычно подразумевают потерю производительности в вычислениях.
Тем не менее, вы не можете отключить их, иначе такой код все еще может вызвать исключение с плавающей точкой DIVIDE BY ZERO (если включено):
float getInverse(float a, float b) {
if (a != b)
return 1.0f / (a-b); // With denormals disabled, a != b can be true, but (a - b) can still be denormals, it'll rounded to 0 and throw the exception
return FLT_MAX;
}