Здравствуйте, Аноним, Вы писали:
А>Всем привет! А>Число 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.
Здравствуйте, 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 ?
Здравствуйте, Аноним, Вы писали:
А>а я вот ничего не понял. А>Можно подробней, почему для 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 будут только чётные.
точно представляются только дроби в знаменателе которых степень двойки (и то не любая)
... << 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 будут только чётные.
Здравствуйте, Аноним, Вы писали:
А>Спасибо вам! А>А подскажите как можно сконвертить число из вида 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
Здравствуйте, 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
и это не сходится с тем что мне показывает конвертер
Здравствуйте, 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
Здравствуйте, Don Reba, Вы писали:
DR>"Отбрасываем еденицу" и "вычитаем наибольшую степень двух" это одно и то же. Ещё можно сделать сдвиг вправо вместо деления.