[объясните]числа с плавающей запятой

Модератор: Модераторы разделов

Ответить
Аватара пользователя
Warchief
Сообщения: 84
ОС: арч , Гента

[объясните]числа с плавающей запятой

Сообщение Warchief »

добрый день,

пытаюсь разобраться с числами с плавающей запятой, но что-то я не сильно понял несколько нюансов. Например, почему если представить числя на числовом луче, то расстояние между ними будет не одинаковое? Как его вообще, расстояние на таком луче, считают? Если можно объясните на пальцах.

Интуитивно вроде понятно, а но формальности - тёмный лес. Специальной литературы прочёл уже порядочно на эту тему, но полного понимания нет.
root@brain # mv -rf /* /dev/null
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: [объясните]числа с плавающей запятой

Сообщение frp »

Warchief писал(а):
25.10.2011 23:22
Как его вообще, расстояние на таком луче, считают?

Прикладывают линейку и меряют :D А если серьезно, из координаты правого конца вычитают координату левого (что есть то же самое, что и померить линейкой) :D

PS. ЕМНИП, изучается в школе, в 6 или 7 классе :D
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: [объясните]числа с плавающей запятой

Сообщение watashiwa_daredeska »

Числа с плавающей точкой представляются в виде комбинации: мантисса + порядок. Мантисса всегда обозначает число в диапазоне [0, 1) и имеет ограниченную фиксированную точность (разрядность). Соответственно, при порядке 0 расстояние между числами составляет единицу младшего разряда мантиссы. Для чисел [1, 2) (двоичное ведь представление) порядок уже не 0, а 1, поэтому шаг чисел составляет единицу младшего разряда * 2^1. И т.д. расстояние между соседними числами составляет единицу младшего разряда мантиссы * 2^порядок.

Если для примера взять такое представление в 10-чной системе: мантисса 3 знака [0, 0.999]. Получим, что:
- числа [0, 1] представляются с порядком 0 (* 10^0) и идут с шагом 0.001,
- числа [1, 10] представляются с порядком 1 (* 10^1) и идут с шагом 0.01,
- числа [10, 100] представляются с порядком 2 (* 10^2) и идут с шагом 0.1,
- ...
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: [объясните]числа с плавающей запятой

Сообщение NickLion »

watashiwa_daredeska писал(а):
26.10.2011 09:43
Мантисса всегда обозначает число в диапазоне [0, 1)

Кстати, не совсем верно, если мы говорим о IEEE 754. Мантисса в диапазоне [1,2) для нормализованных (бóльшая часть) чисел и [0,1) для денормализованных.
Для нормализованных чисел старший бит (всегда равный 1) не хранится с целью экономии. (Хранится в 80-битном представлении, но им практически никто не пользуется).
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: [объясните]числа с плавающей запятой

Сообщение watashiwa_daredeska »

NickLion писал(а):
27.10.2011 19:18
Кстати, не совсем верно
Может быть. Давненько я в эти потроха не заглядывал :) Однако, сути это не меняет.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: [объясните]числа с плавающей запятой

Сообщение drBatty »

NickLion писал(а):
27.10.2011 19:18
(Хранится в 80-битном представлении, но им практически никто не пользуется).

вот как раз _практически_ оно всегда там и считается. FPU других форматов не признаёт и считает только в 80и битном, но конечно после вычислений обычно конвертирует во что-то другое.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: [объясните]числа с плавающей запятой

Сообщение NickLion »

drBatty писал(а):
28.10.2011 14:53
вот как раз _практически_ оно всегда там и считается. FPU других форматов не признаёт и считает только в 80и битном, но конечно после вычислений обычно конвертирует во что-то другое.

Согласен, в FPU - 80 бит, но для хранения и в расчётах в программах, почти всегда 32 или 64. А если не хватает, то обычно длинную арифметику делают.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: [объясните]числа с плавающей запятой

Сообщение drBatty »

NickLion писал(а):
28.10.2011 18:26
но для хранения и в расчётах в программах, почти всегда 32 или 64.

компилятор обычно сворачивает расчёты внутрь стека сопроцессора, потому расчёты исполняются таки на 80и битах. Хотя конечно хранятся результаты в 32х или 64х битах.
т.ч. формат с 80ю битами востребован.
Warchief писал(а):
25.10.2011 23:22
Интуитивно вроде понятно, а но формальности - тёмный лес. Специальной литературы прочёл уже порядочно на эту тему, но полного понимания нет.

всё просто: есть мантисса (число от 0 до 1 со знаком, причём она всегда меньше 1), и есть порядок. Ну как в десятичной записи: 1.234567788999023 * 10^17
только тут двоичная система счисления. В двоичной системе счисления первый бит мантиссы всегда равен нулю, а второй - единице (если она нормализованная), потому их и не хранят. Т.е.
0.100111000111 * 2^100101
тут не надо хранить первый ноль и вторую единицу. Если вторая цифра ноль, то можно мантиссу сдвинуть влево, вычесть 1 из порядка. Если всё равно 0, то повторить. Есть только два особых случая:
1. ноль
2. НЕХ (NaN)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: [объясните]числа с плавающей запятой

Сообщение frp »

drBatty писал(а):
28.10.2011 19:40
т.ч. формат с 80ю битами востребован.

80-бит - это x86-only. И он не используется при -mfpmath=sse
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: [объясните]числа с плавающей запятой

Сообщение drBatty »

frp писал(а):
28.10.2011 21:50
80-бит - это x86-only. И он не используется при -mfpmath=sse

а что там используется?
SSE началось с iPIII, но вот я вот не вижу никаких изменений именно для FP чисел. Что видите вы?


frp писал(а):
28.10.2011 21:50
это x86-only

ну да... конечно...
у вас другие процессоры, и вы этот пост написали под XYZ.
не смешите меня. не смешно на вас.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Ответить