точно ли представлено число в double
От: Аноним  
Дата: 14.09.13 18:44
Оценка: :)))
Всем привет!
Число 1 / (24*60*60) — будет точно представлено в виде double значения?

Формат дабла понимаю.. но сообразить не могу)...
подскажите коллеги как понять какое число будет представляться точно а какое нет?...
Re: What Every Computer Scientist...
От: Qbit86 Кипр
Дата: 14.09.13 18:50
Оценка: +1 -2
Здравствуйте, Аноним, Вы писали:

А>подскажите коллеги как понять какое число будет представляться точно а какое нет?...


What Every Computer Scientist Should Know About Floating-Point Arithmetic
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: What Every Computer Scientist...
От: Аноним  
Дата: 14.09.13 19:02
Оценка: +1
Здравствуйте, Qbit86, Вы писали:

Q>What Every Computer Scientist Should Know About Floating-Point Arithmetic


А на исходный вопрос
A>> Число 1 / (24*60*60) — будет точно представлено в виде double значения?
можете ответить ? ...
Re: точно ли представлено число в double
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 14.09.13 19:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Всем привет!

А>Число 1 / (24*60*60) — будет точно представлено в виде double значения?

А>Формат дабла понимаю.. но сообразить не могу)...

А>подскажите коллеги как понять какое число будет представляться точно а какое нет?...

Берёшь две ближайшие степени двойки, делишь прожуток между ними на 252 для double, 223 для float, и смотришь к какому делению твоё число ближе всего.

Твоё число находится между 2-16 и 2-17.

(1/(24*60*60) — 2-17) / 2-17 = 349/675, что явно не кратно 2-52.
Ce n'est que pour vous dire ce que je vous dis.
Re[2]: точно ли представлено число в double
От: Аноним  
Дата: 14.09.13 19:48
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>Здравствуйте, Аноним, Вы писали:


А>>Всем привет!

А>>Число 1 / (24*60*60) — будет точно представлено в виде double значения?

DR>Берёшь две ближайшие степени двойки, делишь прожуток между ними на 252 для double, 223 для float, и смотришь к какому делению твоё число ближе всего.


DR>Твоё число находится между 2-16 и 2-17.


DR>(1/(24*60*60) — 2-17) / 2-17 = 349/675, что явно не кратно 2-52.


Спасибо!
Re[2]: точно ли представлено число в double
От: Аноним  
Дата: 15.09.13 07:55
Оценка: -1
Здравствуйте, Don Reba, Вы писали:

DR>Здравствуйте, Аноним, Вы писали:


А>>Всем привет!

А>>Число 1 / (24*60*60) — будет точно представлено в виде double значения?

А>>Формат дабла понимаю.. но сообразить не могу)...

А>>подскажите коллеги как понять какое число будет представляться точно а какое нет?...

DR>Берёшь две ближайшие степени двойки, делишь прожуток между ними на 252 для double, 223 для float, и смотришь к какому делению твоё число ближе всего.


DR>Твоё число находится между 2-16 и 2-17.


DR>(1/(24*60*60) — 2-17) / 2-17 = 349/675, что явно не кратно 2-52.


а я вот ничего не понял.
Можно подробней, почему для 252 для double, 223 для float ?
Re[3]: точно ли представлено число в double
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 15.09.13 08:24
Оценка: 17 (3)
Здравствуйте, Аноним, Вы писали:

А>а я вот ничего не понял.

А>Можно подробней, почему для 252 для double, 223 для float ?

Хорошо. Формат чисел с плавающей запятой, на самом деле, очень простой. Он состоит из двух компонентов: порядка и мантиссы. Порядок выражает точки на экспоненциальной кривой 2x. Во float под него отведено 8 бит, что даёт диапазон 2^-126-2126 (-127 и 127 имеют особое значение). В double под порядок отведено 11 бит.

Мантисса это просто линейная интерполяция между экспоненциальными точками выраженными порядком. Во float под неё отведено 23 бита, что даёт восемь миллионов делений, а в double 52 бита. К примеру, когда ты используешь числа float в диапазоне 8-16 миллионов (порядок — 23), то мантисса ложится ровно на целые числа — дробная часть уже не помещается. А в диапазоне 16-32 миллиона во float будут только чётные.
Ce n'est que pour vous dire ce que je vous dis.
Re: точно ли представлено число в double
От: cvetkov  
Дата: 15.09.13 10:31
Оценка: +2
точно представляются только дроби в знаменателе которых степень двойки (и то не любая)
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re[4]: точно ли представлено число в double
От: Аноним  
Дата: 17.09.13 05:17
Оценка:
Здравствуйте, Don Reba, Вы писали:

Спасибо вам!
А подскажите как можно сконвертить число из вида 145.12 в экспоненциальное представление, чтобы увидеть какой будет порядок?
Хочу поиграться с закреплением.


DR>Хорошо. Формат чисел с плавающей запятой, на самом деле, очень простой. Он состоит из двух компонентов: порядка и мантиссы. Порядок выражает точки на экспоненциальной кривой 2x. Во float под него отведено 8 бит, что даёт диапазон 2^-126-2126 (-127 и 127 имеют особое значение). В double под порядок отведено 11 бит.


DR>Мантисса это просто линейная интерполяция между экспоненциальными точками выраженными порядком. Во float под неё отведено 23 бита, что даёт восемь миллионов делений, а в double 52 бита. К примеру, когда ты используешь числа float в диапазоне 8-16 миллионов (порядок — 23), то мантисса ложится ровно на целые числа — дробная часть уже не помещается. А в диапазоне 16-32 миллиона во float будут только чётные.
Re[5]: точно ли представлено число в double
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 17.09.13 05:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Спасибо вам!

А>А подскажите как можно сконвертить число из вида 145.12 в экспоненциальное представление, чтобы увидеть какой будет порядок?
А>Хочу поиграться с закреплением.

145.12 находится между 128 и 256, значит порядок будет 7. Чтобы получить битовое представление для float, прибавляем к порядку 127 — получаем 134 или 1000 0110. Чтобы найти мантиссу, смотрим где на промежутке между степенями находится наше число: (145.12 — 128) / 128 = 0.13375. Находим ближайшее деление из 2^23: 0.13375 * 223 ≈ 1 121 976 или 001 0001 0001 1110 1011 1000. Так как число положительное, первый бит будет 0. Итого:

0 10000110 00100010001111010111000
Ce n'est que pour vous dire ce que je vous dis.
Re[6]: точно ли представлено число в double
От: Аноним  
Дата: 18.09.13 09:13
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>Здравствуйте, Аноним, Вы писали:


А>>Спасибо вам!

А>>А подскажите как можно сконвертить число из вида 145.12 в экспоненциальное представление, чтобы увидеть какой будет порядок?
А>>Хочу поиграться с закреплением.

DR>145.12 находится между 128 и 256, значит порядок будет 7. Чтобы получить битовое представление для float, прибавляем к порядку 127 — получаем 134 или 1000 0110. Чтобы найти мантиссу, смотрим где на промежутке между степенями находится наше число: (145.12 — 128) / 128 = 0.13375. Находим ближайшее деление из 2^23: 0.13375 * 223 ≈ 1 121 976 или 001 0001 0001 1110 1011 1000. Так как число положительное, первый бит будет 0. Итого:


DR>0 10000110 00100010001111010111000


Слушайте, благодарен вам очень-очень!
Re[6]: точно ли представлено число в double
От: snaphold  
Дата: 02.09.14 13:18
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>Здравствуйте, Аноним, Вы писали:


А>>Спасибо вам!

А>>А подскажите как можно сконвертить число из вида 145.12 в экспоненциальное представление, чтобы увидеть какой будет порядок?
А>>Хочу поиграться с закреплением.

DR>145.12 находится между 128 и 256, значит порядок будет 7. Чтобы получить битовое представление для float, прибавляем к порядку 127 — получаем 134 или 1000 0110. Чтобы найти мантиссу, смотрим где на промежутке между степенями находится наше число: (145.12 — 128) / 128 = 0.13375. Находим ближайшее деление из 2^23: 0.13375 * 223 ≈ 1 121 976 или 001 0001 0001 1110 1011 1000. Так как число положительное, первый бит будет 0. Итого:


DR>0 10000110 00100010001111010111000


Don Reba
хочу представить число 2034.79 в двоичном виде, но не получается

Делаю по вашему шаблону
2034.79 находится между 1024 и 2048, значит порядок будет 10. Чтобы получить битовое представление для float, прибавляем к порядку 127 — получаем 137 или 1000 1001. Чтобы найти мантиссу, смотрим где на промежутке между степенями находится наше число: (2034.79 — 1024) / 1024 = 0.9871. Находим ближайшее деление из 2^23: 0.9871 * 223 ≈ 8280391 или 11111100101100101000111. Так как число положительное, первый бит будет 0. Итого:

DR>0 10001001 11111100101100101000111


и это не сходится с тем что мне показывает конвертер

подскажите, что я не так делаю?
Re[7]: точно ли представлено число в double
От: icWasya  
Дата: 02.09.14 14:02
Оценка:
Здравствуйте, snaphold, Вы писали:

S>Здравствуйте, Don Reba, Вы писали:


DR>>Здравствуйте, Аноним, Вы писали:


А>>>Спасибо вам!

А>>>А подскажите как можно сконвертить число из вида 145.12 в экспоненциальное представление, чтобы увидеть какой будет порядок?
А>>>Хочу поиграться с закреплением.

DR>>145.12 находится между 128 и 256, значит порядок будет 7. Чтобы получить битовое представление для float, прибавляем к порядку 127 — получаем 134 или 1000 0110. Чтобы найти мантиссу, смотрим где на промежутке между степенями находится наше число: (145.12 — 128) / 128 = 0.13375. Находим ближайшее деление из 2^23: 0.13375 * 223 ≈ 1 121 976 или 001 0001 0001 1110 1011 1000. Так как число положительное, первый бит будет 0. Итого:


DR>>0 10000110 00100010001111010111000


S>Don Reba

S>хочу представить число 2034.79 в двоичном виде, но не получается

S>Делаю по вашему шаблону

S>2034.79 находится между 1024 и 2048, значит порядок будет 10. Чтобы получить битовое представление для float, прибавляем к порядку 127 — получаем 137 или 1000 1001. Чтобы найти мантиссу, смотрим где на промежутке между степенями находится наше число: (2034.79 — 1024) / 1024 = 0.9871. Находим ближайшее деление из 2^23: 0.9871 * 223 ≈ 8280391 или 11111100101100101000111. Так как число положительное, первый бит будет 0. Итого:

DR>>0 10001001 11111100101100101000111


S>и это не сходится с тем что мне показывает конвертер


S>подскажите, что я не так делаю?

Вычитать не надо, просто разделить
2034.79 / 1024 = 1.987099609375

1.987099609375 * 223 ≈ 16669000 или 1111 1110 0101 1001 0100 1000
отбрасываем первую единицу 111 1110 0101 1001 0100 1000
добавляем порядок
0 10001001 111 1110 0101 1001 0100 1000
перегруппируем 0100 0100 1111 1110 0101 1001 0100 1000
Re[7]: точно ли представлено число в double
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 02.09.14 14:38
Оценка:
Здравствуйте, snaphold, Вы писали:

S>подскажите, что я не так делаю?


Если округлить к ближайшему, а не вниз, то всё будет правильно.

(2034.79 — 1024) / 1024 * 2^23 = 8280391.68

8280391 = 11111100101100101000111
8280392 = 11111100101100101001000
Ce n'est que pour vous dire ce que je vous dis.
Re[8]: точно ли представлено число в double
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 02.09.14 14:40
Оценка:
"Отбрасываем еденицу" и "вычитаем наибольшую степень двух" это одно и то же. Ещё можно сделать сдвиг вправо вместо деления.
Ce n'est que pour vous dire ce que je vous dis.
Re[9]: точно ли представлено число в double
От: icWasya  
Дата: 03.09.14 05:36
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>"Отбрасываем еденицу" и "вычитаем наибольшую степень двух" это одно и то же. Ещё можно сделать сдвиг вправо вместо деления.


Точно.

А Самое главное-правильно сделать округление.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.