2016-02-07 3 views
0

Результаты Matlab для realmax ('single') являются ans = 3.4028e + 38. Я пытаюсь понять, почему этот номер появляется из двоичного представления компьютера, но я немного смущен.Matlab-представление чисел с плавающей запятой

Я понимаю, что realmax ('single') является наивысшим числом с плавающей запятой, представленным в одиночном percision, которое является 32-битным. Это означает, что двоичное представление состоит из 1 бита для знака, 23 бит для мантиссы и 8 бит для экспоненты. И 3.4028e + 38 - это десятичное представление наивысшего числа с плавающей запятой с единственной точностью, но я не знаю, как было получено это число.

Теперь, набрав 2^128, я получаю тот же ответ, что и 3.4028e + 38, но я не понимаю корреляции.

Может помочь мне понять, почему 3.4028e + 38 является самым большим возвращенным результатом для числа с плавающей запятой в 32-битном формате, исходящем из перспективы двоичного представления? Спасибо.

+4

https://en.wikipedia.org/wiki/Single-precision_floating-point_format –

+0

Да, я видел эту статью в Википедии, пытаясь понять это сам. Хотя это может показаться несложным для многих, я все еще запутался, как получить наибольшее число с плавающей запятой с одинарной точностью. Я надеялся, что кто-то может дать небольшое объяснение, которое поможет очистить мое замешательство. – Chad

ответ

3

Как IEEE754 указывает, наибольшая величина показателя Е макс = 127 = 7F = 0111 1111 . Это кодируется как 254 = FE = 1111 1110 в 8 битах экспоненты. Показатель 255 = FF = 1111 1111 зарезервирован для представления бесконечности, так что 254 является самым большим доступен. Смещения показателя 127 вычитаются из показателя степени бит приводят к 254 -127 = 127 . По величине мантиссы достигается тогда, когда все 23 мантиссы биты устанавливаются в 1. наибольшее значение, которое может быть представлено затем +1,11111111111111111111111 x2 127 = 3,4028235 х10 38.

Этот site позволяет вам установить биты представления и увидеть значение IEEE754, представленное в десятичной, двоичной и шестнадцатеричной.

Также обратите внимание, что наибольшее значение меньше 2^128. Вы можете увидеть более точное представление чисел, выводимых в MATLAB, с помощью format long. Причина они похожи в том, что 1,11111111111111111111111 х2 127 близка к 10 x2 127 = 1 x2 128.

+1

В частности, 'realmax ('single') == (single (2) -eps ('single')) * single (2)^127', где' eps ('single') 'is single (2)^-23'. В двойной точности: 'realmax ('single') == 2^128-2^104'. – horchler

1

Являясь предшественником двоичного представления чисел с двойной точностью чисел в компьютере, я начинаю с обсуждения так называемой «научной нотации» для десятичного числа.

Используя базовую систему счисления 10, каждое положительное десятичное число имеет первую отличную от нуля цифру в наборе {1..9}. (Все остальные цифры находятся в наборе {0..9}.) Десятичная точка числа всегда может быть смещена в непосредственное правое положение этой ведущей цифры, умножая на соответствующую мощность 10^n номера базы 10. Например. 0.= 1.2345 * 10^n, где n = -2.Это означает, что десятичное представление каждого ненулевого числа х можно принять форму

x = (+/-)(i.jklm...)*10^n ; where i is in the set {1,2,3,4,5,6,7,8,9}. 

Ведущий десятичный (i.jklm ...), известный как «мантисса» х, является число в интервале [1,10), то есть больше или равно 1 и меньше 10. Самая большая мантисса может быть равна 9.9999 ... так что реальный «размер» числа x является целым числом, сохраненным в экспоненциальный множитель 10^п. Если число x очень велико, n >> 0, а если x очень мало, то n < < 0.

Теперь мы хотим пересмотреть эти идеи, используя базовую систему с 2 номерами, связанную с хранением номеров компьютеров. Компьютеры представляют число, внутренне использующее базу 2, а не более известную базу 10. Все цифры, используемые в «двоичном» представлении числа, принадлежат множеству {0,1}. Используя тот же самый вид мышления для представления х в двоичном представлении, как мы делали в десятичном представлении, мы видим, что каждое положительное число х имеет вид

x = (+/-)(i.jklm...)*2^n ; where i = 1, 

а остальные цифры принадлежат {0,1}.

Здесь ведущий двоичный коэффициент (мантисса) i.jklm ... лежит в интервале [1,2), а не в интервале [1,10), связанном с мантиссой в десятичной системе. Здесь мантисса ограничена двоичным числом 1.1111 ..., который всегда меньше 2, так как на практике никогда не будет бесконечного числа цифр. Как и раньше, реальный «размер» числа x сохраняется в целочисленном экспоненциальном множителе 2^n. Когда x очень велико, то n >> 0 и когда x очень мало n < < 0. Показатель n выражается в двоичной десятичной системе. Поэтому каждая цифра в двоичном представлении с плавающей запятой x является либо 0, либо 1. Каждая такая цифра является одним из «битов», используемых в памяти компьютера для хранения x.

Стандартное соглашение для двоичного представления (одиночной точности) x выполняется путем хранения ровно 32 бит (0 или 1) в памяти компьютера. Первый бит используется для обозначения арифметического «знака» числа. Это позволяет распределить 31 бит между мантиссой (i.jklm ...) x и экспоненциальным множителем 2^n. (Вспомните i = 1 в i.jklmn ... поэтому для его представления не требуется ни один из 31 бит.) В этот момент вступает в игру важный «компромисс»:

Больше бит, предназначенных для mantissa (i.jkl ...) of x, тем меньше, чем доступно для экспоненты n в экспоненциальном множителе 2^n. Обычно 23 бит посвящены мантиссе x. (Нетрудно показать, что это позволяет приблизительно 7 цифр точности для x, если смотреть в десятичной системе, что является достаточным для большинства научных работ.) С самого первого бита, предназначенного для хранения знака x, это оставляет 8 бит которая может быть использована для представления n в множителе 2^n. Так как мы хотим, чтобы для очень больших х и очень малых х, было принято решение хранить 2^п в виде

2^n = 2^(m-127) ; n = m - 127, 

где хранится показатель т, а не п. Используя 8 бит, это означает, что m относится к набору двоичных целых чисел {000000,00000001, .... 11111111}. Так как людям легче думать в десятичной системе, это означает, что m принадлежит множеству значений {0,1, ... 255}. Вычитая -127, это означает, в свою очередь, что 2^n принадлежит числу {-127, -126, ... 0,1,2 ... 128}, т. Е.

-127 <= n <= 128. 

Самый большой экспоненциальный множитель 2^п нашей двоичной плавающей точкой представления х может быть затем видно, что 2^п = 2^128, или просмотрены в десятичной системе (использовать любой калькулятор для оценки 2^128)

     2^n <= 3.4028...*10^38. 

Подводя итог, наибольшее число х, которые, возможно, могут быть сохранены в одной точности с плавающей точкой в ​​компьютере под формате IEEE является числом в виде

    x = y*(3.4028...*10^38). 

Он re мантисса y лежит в (полузамкнутом, полуоткрытом) интервале [1,2).

Для простоты Matlab сообщает «размер» «наибольшего» возможного числа с плавающей запятой как наибольший размер экспоненциального коэффициента 2^128 = 3,4028 * 10^38. Из этого обсуждения мы видим, что наибольшее число с плавающей запятой, которое может быть сохранено с использованием 32-битного двоичного представления с плавающей запятой, фактически удваивается до max_x = 6.8056 * 10^38.

Смежные вопросы