Форум: "Начинающим";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];
Внизпомогите пожалуста понять тип Double Найти похожие ветки
← →
Apachi (2007-05-15 13:20) [0]Я обрабатываю массивы байтов по 8 штук
и мне надо знать корректно ли они преобразуются в тип Double
мне просто доку надо наити где можно прочесть что каждый байт означает
спасибо
← →
clickmaker © (2007-05-15 14:02) [1]
> Apachi (15.05.07 13:20)
каждый байт - 1/8 часть double
старший - по бОльшему адресу на Интел-совместимой архитектуре
← →
Apachi (2007-05-15 14:40) [2]неа :)
вот нашол статью
http://lib.profi.net.ua/doc/info_sites/visprog/books/DelphiKindom/reals.htm
вот она критическая ситуация
Рассмотрим тип Single, так как он является самым коротким и, следовательно, самым простым для понимания. Остальные типы отличаются от него только количественно. В дальнейшем числа в формате Single мы будем записывать как s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm, где s означает знаковый бит, e – бит экспоненты, m – бит мантиссы. Именно в таком порядке эти биты хранятся в четырёхбайтном значении (здесь учтена перестановка байтов; напоминаю, что в процессорах Intel байты в многобайтных значениях переставляются так, что младший байт идёт первым, а старший – последним). В мантиссе хранится двоичное число. Чтобы получить истинное значение мантиссы, к ней надо мысленно добавить слева единицу с точкой (то есть, например, мантисса 1010000000000000000000 означает двоичную дробь 1.101). Таким образом, имея 23 двоичных разряда, мы записываем числа с точностью до 24-ёх двоичных разрядов.
Экспонента по определению всегда целое число. Но способ записи экспоненты в вещественных числах не совпадает с обычным способом записи чисел со знаком. Ноль в этом представлении записывается как 01111111. В обычном представлении это равно 127. Соответственно, 10000000 (128 в обычном представлении) означает единицу, а 01111110 (126) означает –1, и так далее (то есть из обычного беззнакового числа надо вычесть 127, и получится число, закодированное в экспоненте). Такая запись числа называется нормализованной.
Из описанных выше правил есть исключения. Так, если все биты экспоненты равны нулю (то есть там стоит число –127), то к мантиссе перед её началом надо добавлять не “1.”, а “0.” (денормализованная запись). Это позволяет увеличить диапазон вещественных чисел. Если бы этого исключения не было бы, минимально возможное положительное число типа Single было бы равно примерно 5.9*10-39. А так появляется возможность использовать числа до 1.4*10-45. Побочным эффектом этого является то, что числа, меньшие чем 1.17*10-38 представляются с меньшей, чем 24 двоичных разряда, точностью.
Если все биты в экспоненте равны единице, а в матрице – нулю, то мы получаем комбинацию, известную как INF (от английского Infinity – бесконечность). Эта комбинация используется тогда, когда результат вычислений превышает максимально допустимое форматом число. В зависимости от значения бита s бесконечность может быть положительной или отрицательной. Если же при такой экспоненте в мантиссе хоть один бит не равен нулю, такая комбинация называется NAN (Not A Number – не число). Попытки использования комбинаций NAN или INF приводят к ошибке времени выполнения.
С учётом всех этих правил комбинация, когда и в мантиссе, и в экспоненте все биты равны нулю, даёт 00. С математической точки зрения эта комбинация бессмысленна, но разработчики формата договорились считать такую комбинацию нулём.
Тип Double устроен точно так же, разница только в количестве разрядов и в том, какое значение экспоненты берётся за ноль. Итак, мы имеем 11 разрядов для экспоненты. За ноль берётся значение 1023.
Несколько иначе устроен Extended. Кроме количественных отличий добавляется ещё и одно качественное: в мантиссе явно указывается первый разряд. То есть, мантисса 1010... интерпретируется как 1.01, а не как 1.101, как это было в типах Single и Float. Поэтому если 23-битная мантисса типа Single обеспечивает 24-знаковую точность, а 52-битная мантисса Double – 53-битную, то 64-битная мантисса Extended обеспечивает 64-, а не 65-битную точность. Соответственно, при денормализованной форме записи первый разряд мантиссы явно содержит 0. За ноль экспоненты принимается значение 16383.
Тип Real, как уже упоминалось, стоит особняком. Во-первых, в нём используется другой порядок следования битов, а, во-вторых, не используется денормализованная форма. Я не стал детально разбираться с типом Real, потому что сейчас это нужно разве что историкам, но никак не программистам.
← →
Однокамушкин (2007-05-15 20:52) [3]
> С учётом всех этих правил комбинация, когда и в мантиссе,
> и в экспоненте все биты равны нулю, даёт 00. С математической
> точки зрения эта комбинация бессмысленна, но разработчики
> формата договорились считать такую комбинацию нулём.
Неправильная, кстати, фраза - когда все биты равны нулю, это для Single формально означает 0^-127, а не 0^0, как пишет автор. Так что здесь верна только вторая часть - что такая и только комбинация принимается за ноль... а ноль в любой другой степени - это NAN...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 4.693 c