Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1178117833
Kerk
2007-05-02 18:57
2007.06.03
Бышовец выгнал Лоськова


15-1178201448
Root.Square.Root
2007-05-03 18:10
2007.06.03
Элементарно!


6-1164176859
FaTRuS
2006-11-22 09:27
2007.06.03
SMS+Проблема с Post запрсом


2-1178874470
KIV
2007-05-11 13:07
2007.06.03
рисовать по мировым координатам


15-1178529482
lu4ina
2007-05-07 13:18
2007.06.03
TreeView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский