Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Числа с плавающей точкой 
:(
    Опции темы
Proger89
Дата 9.11.2009, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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") и все совпадает, но почему так получаеться, понять не могу... 

Заранее спасибо.
PM   Вверх
Mikl_
Дата 10.11.2009, 06:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
FCM
Дата 11.11.2009, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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.
Так ли это или дело в другом?   
PM MAIL   Вверх
airyashov
Дата 11.11.2009, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 1.7.2008

Репутация: 2
Всего: 6



почему бы не углубится в библиотеку
Код

...
#if defined(_RWSTD_NO_STI_SIMPLE) //&& !defined(_RWSTD_FLT_ROUNDS_IS_CONSTANT)
#define __RW_INIT(n) = n
#else
#define __RW_INIT(n) /**/
#endif
...
const int  numeric_limits<double>::min_exponent   __RW_INIT(DBL_MIN_EXP);
const int  numeric_limits<double>::max_exponent   __RW_INIT(DBL_MAX_EXP);
....
define DBL_MAX_EXP         +1024
#define FLT_MAX_EXP         +128
#define LDBL_MAX_EXP        +16384

#define DBL_MAX_10_EXP      +308
#define FLT_MAX_10_EXP      +38
#define LDBL_MAX_10_EXP     +4932

#define DBL_MIN_10_EXP      -307
#define FLT_MIN_10_EXP      -37
#define LDBL_MIN_10_EXP     -4931

#define DBL_MIN_EXP         -1021
#define FLT_MIN_EXP         -125
#define LDBL_MIN_EXP        -16381

...





--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
FCM
Дата 11.11.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Цитата(airyashov @  11.11.2009,  10:56 Найти цитируемый пост)
почему бы не углубится в библиотеку


Все эти характеристики извлекаются в любом языке программирования.
Ответа на поставленный вопрос я там не вижу.
PM MAIL   Вверх
airyashov
Дата 11.11.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 1.7.2008

Репутация: 2
Всего: 6



Цитата(Mikl_ @ 10.11.2009,  06:30)

Типы REAL4, REAL8 и REAL10 в ассемблере соответствуют стандартным веще­ственные типам Single (4 байта), Double (8 байта) и Extended (10 байт) в C/C++ и Pascal/Delphi. Первые два типа (REAL4 и REAL8) являются «упакованны­ми», а REAL10 - «неупакован­ным» типом, в нем целая часть (всегда единич­ный бит) хранится в явном виде. Все вычисле­ния внутри FPU происходят после автоматического преобразования типов  REAL4 и REAL8 в REAL10.

подумайте над этим постом

Это сообщение отредактировал(а) airyashov - 11.11.2009, 13:30


--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
Mikl_
Дата 11.11.2009, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 6
Всего: 14



Цитата(FCM)
Согласно 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.
Так ли это или дело в другом?  

согласно русской 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 Num­ber). Среди х есть единицы. FPU реагиру­ет на появ­ление SNAN возбуждением ис­ключения не­действительной операции
х    11111111    11ххх...ххххххххх    Нечисло типа QNAN (Quiet Non A Num­ber). Среди х есть единицы.
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
PM MAIL   Вверх
Mikl_
Дата 11.11.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 6
Всего: 14



airyashov
Цитата(airyashov)
подумайте над этим постом

Не понятно, к кому идет обращение, и о чем там думать? smile 
PM MAIL   Вверх
airyashov
Дата 11.11.2009, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 1.7.2008

Репутация: 2
Всего: 6



Цитата(Mikl_ @ 11.11.2009,  14:37)
airyashov
Цитата(airyashov)
подумайте над этим постом

Не понятно, к кому идет обращение, и о чем там думать? smile

еще есть значащая единица
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
PM MAIL   Вверх
Mikl_
Дата 12.11.2009, 05:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
Mikl_
Дата 12.11.2009, 06:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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 !

PM MAIL   Вверх
airyashov
Дата 12.11.2009, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 1.7.2008

Репутация: 2
Всего: 6



Цитата(Mikl_ @ 12.11.2009,  06:38)
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 !

неправильно сформулировал мысль вернее будет так
log2(1.11111..1*2^127)=128
1.11111..1-соотвественно двоичное
хотя для минимального сказать так всеже будет неверно.
вообще Я с вами согласен, но почему тогда во всех пакетах c++ такие константы

Это сообщение отредактировал(а) airyashov - 12.11.2009, 09:43


--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
Mikl_
Дата 12.11.2009, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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 число
PM MAIL   Вверх
airyashov
Дата 12.11.2009, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 1.7.2008

Репутация: 2
Всего: 6



все же думаю зря мы тут копья ломает над константами
Имена, приведенные в следующей таблице, взяты из <float.h> и являются константами, имеющими отношение к арифметике с плавающей точкой. Значения (если они есть) представляют собой минимальные значения для соответствующих величин. В каждой реализации устанавливаются свои значения. 


Это сообщение отредактировал(а) airyashov - 12.11.2009, 09:56


--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
Mikl_
Дата 12.11.2009, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 6
Всего: 14



airyashov
Ладно мир smile 
Всё равно это было полезно -- полазил по справочникам, освежил мозги smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1273 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.