![]() |
|
|
![]()
|
|
| koren |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 7.11.2009 Репутация: нет Всего: 2 |
Может посоветовать функцию STL для округления числа типа double с заданной точностью.
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
Почему именно STL? Код примерно такой (GRID - точность - 0.1, 0.001 и т.д.)
-------------------- ... |
|||
|
||||
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Напишу сюда же чтобы темы не плодить.
Что-то я застрял на вопросе как округлить число до заданного количества значащих цифр? -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
Значащих цифр - это в смысле цифр в мантиссе? Видимо, разложить число на мантиссу и экспоненту, округлить мантиссу и собрать обратно.
Разложение числа в C Runtime - frexp. Добавлено через 4 минуты и 56 секунд Только экспонента там двоичная, а тебе, видимо, десятичная нужна - значащие цифры-то, в десятичном представлении поди... Значит, нужно получить разложение, но десятичную мантиссу и экспоненту. -------------------- ... |
|||
|
||||
| Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 2 Всего: 49 |
Если не работать на пределе точности типа, то умножить на 10^n (где n - "заданное количество"), округлить до целого, разделить на 10^n. Добавлено через 1 минуту и 39 секунд Прочитал предыдущий комментарий и понял, что, по-видимому, Earnest, прав. Тогда совет отменяется. |
|||
|
||||
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Earnest, Фантом Нет, значащие цифры к мантиссе отношения не имеют. Это не математическое, а физическое понятие. Вот примеры округления чисел разного порядка до трех значащих цифр:
12345 -> 12300 1234,5 -> 1230 123,45 -> 123 1,2345 -> 1,23 0,000012345 -> 0,0000123 В общем, я уже решил проблему примерно так. 1. Сначала беру целую часть десятичного логарифма исходного числа чтобы определить его порядок P = floor(lg(val)) 2. Получаю делитель возведением десятки в степень P-Z, где Z - требуемое число значащих цифр. D = 10^(P-Z) 3. Делю, округляю, умножаю val = D*round(val/D) Это сообщение отредактировал(а) _Y_ - 29.3.2012, 15:39 -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 4 Всего: 101 |
||||
|
||||
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
что-то я не очень понял что в моих выкладках называется словом "нормализовано". Хорошо бы поподробнее -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 2 Всего: 85 |
Поскольку double это двоичный формат, то рассуждения на тему округления его до n десятичных чисел, смысла не имеют. Например число 1,23 (точно!) вообще не представимо в двоичном формате (в частности в double) так же как, напрмер, 1/3 (точно), не представимо в десятичном. В общем сам вопрос не корректен. Имеет смысл говорить только об округлении десятичных чисел, либо об округлении при выводе. но никак не об Это сообщение отредактировал(а) volatile - 30.3.2012, 02:19 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
_Y_,
число с плавающей точкой хранится в виде нормализованной мантиссы и порядка, как уже объяснил baldina Что касается поста volatile, речь обычно идет о видимости, об отображении (чтобы не пугать пользователя числами типа 2.999999998 и не объяснять, что это то же самое, что 3). По крайней мере, я именно так поняла. В другом контексте "округление" никакого смысла не имеет. Кстати, забыла добавить, что с округлением мантиссы при выводе хорошо справляется стара добрая printf c форматом g. Но это для C. -------------------- ... |
|||
|
||||
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Врошу прощения. Ввел сумятицу. Не хотел плодить темы, добавил свой вопрос в старую. В результате, Вы отвечаете на первый пост, написанный больше двух лет назад. Каюсь Earnest, скорее всего, я во что-то не въезжаю в твоем ответе. Я говорю здесь об огруглении до значащих цифр. Это понятие физическое и происходит (мабуть) из метрологии. К машинному представлению отношения большого не имеющее. Для тех, кто с теорией измерений не знаком, попытаюсь кратко и на примере изложить идею: Школьной линейкой можно померить длину. Намерим, 255 миллиметров. Можно, конечно, гордиться точностью глаза и утверждать, что разглядел 255,26 миллиметра. Теперь даем эксперту с глазом-алмазом другую школьную линейку. Наизмерял 255,41 миллиметр. Что поделать - линейка не микрометр и в десятках дает ошибку. В результате десятые доли миллиметра измерены с ошибкой, а сотые так вообще смысла не имеют. Так вот, значащие цифры это все достоверные цифры плюс первая, содержащая ошибку: наш пример имеет четыре значащие цифры. Кстати, нашел в Инете такой пример (к занчащим цифрам отношения не имеет прямого, но задача аналогичная). Имеем цифровой вольтметр, показывающий четыре цифры. Между ними десятичную запятую в нужном месте. Измеряем напряжение, а дальше, в зависимости от напряжения, нужно округлить до того числа цифр, которое помещается на четырехразрядном индикаторе. -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
Да все правильно. Число 12345 и число 123.45 имеют одно и то же число значащих цифр. И мантисса у них одинаковая будет: 1.2345, только порядки разные (то в какой степени 10, на который она умножается). Первое число обычно записывается (в нормализованном виде) 1.2345E5, второе - 1.2345E2. И у числа 1234500000000 ровно такое же количество значащих цифр.
Т.е. отличие только в порядке. Это не машинное представление. Но и машинное тоже не с неба свалилось: там то же самое, но порядок двоичный и мантисса от 0 до 1. Да, и замечание volatile насчет уместности округления только в контексте вывода никуда не девается, пока ты сидишь за монитором, а не переходишь на счеты. Ибо некоторые числа, какими бы круглыми они не казались в десятичном виде, точно в двоичном не представляются. -------------------- ... |
|||
|
||||
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
Earnest, спасибо. Теперь речи ваши оставили след в моем сознании
Ну задачу я, вроде, решил давно. А теперь вот и уровень своего понимания повысил -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |