Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

Примитивные типы Java float и double

#java #float #double


Кто может подсказать максимальные размеры для float и double по вики:

float   32  от 3.4е-038 до 3.4е+038
double  64  от 1.7е-308 до 1.7е+308

По этому коду:

   System.out.println("MAX FLOAT : "+Float.MAX_VALUE);
   System.out.println("MIN FLOAT : "+Float.MIN_VALUE);
   System.out.println("MAX Double : "+Double.MAX_VALUE);
   System.out.println("MIN Double : "+Double.MIN_VALUE);


MAX FLOAT : 3.4028235E38
MIN FLOAT : 1.4E-45
MAX Double : 1.7976931348623157E308
MIN Double : 4.9E-324

Вопрос следующий, где правда?
    


Ответы

Ответ 1



Смотрите. Есть разница между минимальным нормализованным и ненормализованным значениями. 1.1754943508222875E-38f — это минимальное нормализованное, 1.401298464324817E-45f — минимальное ненормализованнoе значение для float. Вот официальная документация. Немного теории. Обычно числа с плавающей запятой записываются внутри в виде мантисса + экспонента, где мантисса — это число от 0.1 до 1, а экспонента — показатель степени десятки. Например, число 0.0015 содержится как 0.15 + степень 10^-2, 44 — как 0.44 и степень 10^2. (На самом деле там то же самое в двоичном виде, степени двойки и числа между 1 и 2^-1. Но важен принцип.) Под мантиссу отводится фиксированное количество разрядов, стартовая цифра выбрасывается для экономии (потому что она должна быть равна 1 в двоичной системе). Так вот: можно немного выйти за нижнюю грань, используя денормализованные числа — числа наподобие 0.0000156 * 10^-38. У них точность хуже, чем у нормальных чисел, т. к. старшие разряды мантиссы используются для укказания величины. Но это лучше, чем просто 0.

Комментариев нет:

Отправить комментарий