![]() |
|
![]() ![]() ![]() |
|
Proger89 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 13.12.2007 Репутация: нет Всего: нет |
Доброго времени суток.
Помогите разобраться с представлением чисел с плавающей точкой в памяти. Вопрос у меня по конкретному примеру. Число +1,0 в памяти должно быть представлено следующим образом 0...0 0...0 0...0 0...0 0...0 0...0 0...0 1000 0000 1111 1111 0011 1111 Учитывая обратный порядок байт для процессоров Intel истинное представление числа будет: 0011 1111 1111 1111 1000 0000 и нули в конце Первый байт слева в этом представлении это знак... Значит число положительное. Следующие 15 битов это порядок 011 1111 1111 1111 == 16383, а так как к истинному порядку числа в 80-ти разрядных числах с плавающей запятой прибавляется 16383, но истинный порядок числа равен 0-лю. А теперь собственно вопрос. Почему мантиса числа 1,0 представлена в виде числа 1? Ведь все числа нормализуються, а единица отвечающая за целую часть не храниться... То есть нормализованное представление числа 1,0 должно быть 1,0*2^0 и если не записывать ведущую единицу, то остается ноль. Откуда в числе появляется "1000 0000" вместо нулей? Данное задание было олимпиадным, я проверил его в OllyDbg (он показал "3FFF 8000 0000 0000 0000") и все совпадает, но почему так получаеться, понять не могу... Заранее спасибо. |
|||
|
||||
Mikl_ |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 6 Всего: 14 |
Proger89,
Вещественные числа в памяти компьютера хранятся в нормализованном виде, то есть оно обязательно должно иметь следующий вид: (-1)^S * 1,M * 2^P, где значение S определяет знак (S=0 число положительное, S=1 отрицательное), M двоичная мантисса числа, P порядок двоичного числа. Из-за того, что старший разряд двоичной мантиссы всегда равен 1, его, из соображений увеличения разрядности числа, предпочитают «хранить в уме» при представлении вещественного числа в 4 байтном (REAL4) и 8 байтном (REAL8) виде. Но у тебя вопрос о 10 байтовом числе. Для 10 байтового числа (80 бит) представление следующее: 79-ый бит -- знак, 78-64 биты -- поле порядка, 63-ий бит -- целая часть, 62-0 биты -- поле мантиссы. Типы REAL4, REAL8 и REAL10 в ассемблере соответствуют стандартным вещественные типам Single (4 байта), Double (8 байта) и Extended (10 байт) в C/C++ и Pascal/Delphi. Первые два типа (REAL4 и REAL8) являются «упакованными», а REAL10 - «неупакованным» типом, в нем целая часть (всегда единичный бит) хранится в явном виде. Все вычисления внутри FPU происходят после автоматического преобразования типов REAL4 и REAL8 в REAL10. Это сообщение отредактировал(а) Mikl_ - 10.11.2009, 06:39 |
|||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Позвольте влезть со своим вопросом по данной теме
(я его задавал в С++ ветви, но там гробовое молчание) Сформулирую вопрос на примере float-чисел Согласно IEEE-754 (http://en.wikipedia.org/wiki/Single_precision_floating-point_format) минимальное и максимальные значения экспоненты для 4-х байтовых floating point numbers равны -126 и 127. При этом смещение равно 127. Однако numeric_limits<float>::min_exponent и max_exponent возвращают -125 и 128. Возникает предположение, что (a) из мантиссы вынесли 2-ку в порядок и (b) уменьшили смещение порядка на 1. Так ли это или дело в другом? |
|||
|
||||
airyashov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 1.7.2008 Репутация: 2 Всего: 6 |
почему бы не углубится в библиотеку
-------------------- icq:3(один)7748666 mail:airyashov( а )inbox.ru |
|||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
||||
|
||||
airyashov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 1.7.2008 Репутация: 2 Всего: 6 |
подумайте над этим постом Это сообщение отредактировал(а) airyashov - 11.11.2009, 13:30 -------------------- icq:3(один)7748666 mail:airyashov( а )inbox.ru |
|||
|
||||
Mikl_ |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 6 Всего: 14 |
согласно русской wiki Точность Одинарная Размер (байты) 4 Число десятичных знаков 7 Наименьшее значение (>0), denorm 1,4×10^(-45) Наименьшее значение (>0), normal 1,2×10^(-38) Наибольшее значение 3,4×10^38 Поля S-E-F Размер полей 1-8-23 под порядок отвелено 8 бит (вы это назвали значением экспоненты) 0 в смещенном коде должно соответствовать -127, а числу 0xFF должно соответствовать +128 но на практике под дебаггером число 00400000h выглядит как 5.877472е-39 а число 07FC00000h как +NAN а число 7F800000h вообще как +INF читаем в вики "Пара значений показателя зарезервирована для обеспечения возможности представления специальных чисел. К ним относятся значения NaN (Not a Number, не число) и +/-INF (Infinity, бесконечность)," ноль и минус ноль знак Порядок Мантисса Название числа 0 00000000 000...00000000000 +0 1 11111111 111...11111111111 --0 0 11111111 000...00000000000 +∞ (+infinity) 1 11111111 000...00000000000 -∞ (-infinity) х 00000000 ххх...ххххххххххх Денормализованные числа, используются для работы с очень маленькими числами х 11111111 10ххх...ххххххххх Нечисло типа SNAN (Signal Non A Number). Среди х есть единицы. FPU реагирует на появление SNAN возбуждением исключения недействительной операции х 11111111 11ххх...ххххххххх Нечисло типа QNAN (Quiet Non A Number). Среди х есть единицы. 1 11111111 1100...0000000000 Неопределенность (один из вариантов QNAN) отсюда мораль -- реально для поля порядка числа 0 и 0xFF использоваться не могут так как отведены под +/-0 +/- бесконечность SNAN и QNAN и под порядок можно отвести только числа от 1 до 0xFE (от -126 до +127 в дополнительном коде) 2^(+127)=1,7014118346046923173168730371588e+38 2^(-126)=1,1754943508222875079687365372222e-38 Это сообщение отредактировал(а) Mikl_ - 11.11.2009, 14:29 |
|||
|
||||
Mikl_ |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 6 Всего: 14 |
airyashov,
Не понятно, к кому идет обращение, и о чем там думать? ![]() |
|||
|
||||
airyashov |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 1.7.2008 Репутация: 2 Всего: 6 |
еще есть значащая единица 2*2^(+127)=2^(+128) 2*2^(-126)=2^(-125) FLT_MIN_EXP This is the smallest possible exponent value for type float. More precisely, is the minimum negative integer such that the value FLT_RADIX raised to this power minus 1 can be represented as a normalized floating point number of type float. http://www.gnu.org/software/hello/manual/l...Parameters.html Это сообщение отредактировал(а) airyashov - 11.11.2009, 14:54 -------------------- icq:3(один)7748666 mail:airyashov( а )inbox.ru |
||||
|
|||||
Mikl_ |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 6 Всего: 14 |
FCM,
минимальное REAL4 = 1,0 * 2^(-126)=1,1754943508222875079687365372222e-38=2^(-126) максимальное REAL4 =1,11111111 11111111 1111111b*1,7014118346046923173168730371588e+38=3,402823669209384634633746074316e+38=2^(+128) Это сообщение отредактировал(а) Mikl_ - 12.11.2009, 06:11 |
|||
|
||||
Mikl_ |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 6 Всего: 14 |
airyashov,
2*2^(+127)=2^(+128) 2*2^(-126)=2^(-125) <-- здесь ошибка, так как вы умножаете не на 2 а на 1.000 поэтому 2^(-126) минимальное REAL4 число FCM, специально посмотрел под дебаггером ollydbg на число 0 00000001 00000000000000000000000b=800000h оно представляется как 1,175494e-38=2^(-126) и значит numeric_limits<float>::min_exponent -125 не верно а должно быть 1-127=-126 ! |
|||
|
||||
airyashov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 1.7.2008 Репутация: 2 Всего: 6 |
неправильно сформулировал мысль вернее будет так log2(1.11111..1*2^127)=128 1.11111..1-соотвественно двоичное хотя для минимального сказать так всеже будет неверно. вообще Я с вами согласен, но почему тогда во всех пакетах c++ такие константы Это сообщение отредактировал(а) airyashov - 12.11.2009, 09:43 -------------------- icq:3(один)7748666 mail:airyashov( а )inbox.ru |
|||
|
||||
Mikl_ |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 6 Всего: 14 |
airyashov,
1,111...111b*2^(+127)~2*2^(+127)=2^(+128) максимальное REAL4 это как раз и понятно numeric_limits<float>::max_exponent возвращает 128 я об ошибке 2*2^(-126)=2^(-125) <-- здесь ошибка, так как вы умножаете не на 2 а на 1.000 поэтому 2^(-126) минимальное REAL4 число |
|||
|
||||
airyashov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 1.7.2008 Репутация: 2 Всего: 6 |
все же думаю зря мы тут копья ломает над константами
Имена, приведенные в следующей таблице, взяты из <float.h> и являются константами, имеющими отношение к арифметике с плавающей точкой. Значения (если они есть) представляют собой минимальные значения для соответствующих величин. В каждой реализации устанавливаются свои значения. Это сообщение отредактировал(а) airyashov - 12.11.2009, 09:56 -------------------- icq:3(один)7748666 mail:airyashov( а )inbox.ru |
|||
|
||||
Mikl_ |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 6 Всего: 14 |
airyashov,
Ладно мир ![]() Всё равно это было полезно -- полазил по справочникам, освежил мозги ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Asm: Общие вопросы" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |