2015-11-23 3 views
3

я попытался определить DBL_MIN в цикле (для того, чтобы проверить другой вопрос), и я был удивлен выход:Определение DBL_MIN в цикле

double tmp(1.0); 
double min(tmp); 
while(tmp>0) 
{ 
    tmp/=2.0; 
    if(tmp>0) min=tmp; 
     else break; 
} 

cout<<scientific<<endl; 
cout<<"Computed minimum: "<<min<<endl; 
cout<<"Defined minimum: "<<DBL_MIN<<endl; 
if(min>0 && min<DBL_MIN) cout<<"min is between 0 and DBL_MIN, HUH!"<<endl; 

exit(1); 

Выходной сигнал является:

Computed minimum: 4.940656e-324 
Defined minimum: 2.225074e-308 
min is between 0 and DBL_MIN, HUH! 

Как может мин. сохранить значение 4.94e-324, когда наименьшее положительное значение равно 2.2e-308? По моему мнению, положительные значения ниже DBL_MIN не должны быть представлены. Протестировано с GCC 4.9.2 на Core i7 под Linux.

ответ

2

DBL_MIN не менее нормализованный положительное значение двойного. Это означает, что это минимальное значение, которое имеет мантисса не менее 1.0. Вы можете пойти на меньшие номера, если вы выберете меньшую мантиссу.

Так что вы получаете Denormal number. Как Википедия выразилась,

В нормальной величине с плавающей точкой, нет ведущих нулей в мантиссе; вместо этого ведущие нули перемещаются в экспоненту. Таким образом, 0,будет написано как 1,23 × 10 -2. Денормальные числа - это числа, в которых это представление приведет к экспоненте, которая ниже минимальной экспонентой (показатель, обычно имеющий ограниченный диапазон). Такие числа представлены с использованием ведущих нулей в значении.

IEEE 754 standard регулирует представление double (и другие типы с плавающей точкой). Представление состоит из показателя e и мантиссы m (и бита знака, что не имеет значения для этого вопроса).

Для показателя eне равным нулю, соответствующее double значение

(1 + m/2^52) * 2^(e-1023) 

(^ обозначает мощность, и 52 число битов в m, так что m/2^52 всегда находится между 0 включительно и 1 не включительно). Неявные (не входит в m) 1 означает, что минимальное число, которое может храниться таким образом, соответствует m==0 и e==1 (помните, что e!=0 для этого представления), что дает значение

2^(-1022) 

, который ок. 2.225074e-308, то есть DBL_MIN.

Однако e==0 обрабатывается особым образом. Для e==0, неявный 1 падает, что приводит к

(m/2^52) * 2^(-1022) // remember that e==0 

Это позволяет для представления точного нуля (с m==0), а также для subnormals (или) для денормализованных чисел небольшой m. Наименьшее возможное количество для m==1, то есть 2^(-1074), или прибл. 4.940656e-324.

+0

Это объясняет это, спасибо. – Geom