Поиск:

Ответ в темуСоздание новой темы Создание опроса
> double округление с заданной точностью 
:(
    Опции темы
koren
Дата 18.11.2009, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Может посоветовать функцию STL для округления числа типа double с заданной точностью.
PM MAIL   Вверх
Earnest
Дата 18.11.2009, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Почему именно STL? Код примерно такой (GRID - точность - 0.1, 0.001 и т.д.)
Код

val = floor(val / GRID + 0.5) * GRID;



--------------------
...
PM   Вверх
_Y_
Дата 29.3.2012, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Напишу сюда же чтобы темы не плодить.
Что-то я застрял на вопросе как округлить число до заданного количества значащих цифр?


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Earnest
Дата 29.3.2012, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Значащих цифр - это в смысле цифр в мантиссе? Видимо, разложить число на мантиссу и экспоненту, округлить мантиссу и собрать обратно.
Разложение числа в C Runtime - frexp.

Добавлено через 4 минуты и 56 секунд
Только экспонента там двоичная, а тебе, видимо, десятичная нужна - значащие цифры-то, в десятичном представлении поди...
Значит, нужно получить разложение, но десятичную мантиссу и экспоненту.



--------------------
...
PM   Вверх
Фантом
Дата 29.3.2012, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

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



Цитата(_Y_ @  29.3.2012,  14:26 Найти цитируемый пост)

Что-то я застрял на вопросе как округлить число до заданного количества значащих цифр? 

Если не работать на пределе точности типа, то умножить на 10^n (где n - "заданное количество"), округлить до целого, разделить на 10^n.

Добавлено через 1 минуту и 39 секунд
Прочитал предыдущий комментарий и понял, что, по-видимому, 
Earnest, прав. Тогда совет отменяется. 
PM   Вверх
_Y_
Дата 29.3.2012, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 4
Всего: 101



Цитата(_Y_ @  29.3.2012,  15:36 Найти цитируемый пост)
значащие цифры к мантиссе отношения не имеют

имеют прямое. только число должно быть нормализовано, т.е. мантисса в пределах 0..1
ты ведь так и решил, получаешь разложение логарифмом
PM MAIL   Вверх
_Y_
Дата 29.3.2012, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Цитата(baldina @  29.3.2012,  17:56 Найти цитируемый пост)
только число должно быть нормализовано

что-то я не очень понял что в моих выкладках называется словом "нормализовано". Хорошо бы поподробнее smile 


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
volatile
Дата 30.3.2012, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(koren @  18.11.2009,  01:38 Найти цитируемый пост)
округления числа типа double 

Поскольку double это двоичный формат, то рассуждения на тему округления его до n десятичных чисел, смысла не имеют.

Цитата(_Y_ @  29.3.2012,  15:36 Найти цитируемый пост)
1,2345 -> 1,23

Например число 1,23 (точно!) вообще не представимо в двоичном формате (в частности в double)  smile
так же как, напрмер, 1/3 (точно), не представимо  в десятичном.

В общем сам вопрос не корректен.

Имеет смысл говорить только об округлении десятичных чисел, либо об округлении при выводе.
но никак не об
Цитата(koren @  18.11.2009,  01:38 Найти цитируемый пост)
округления числа типа double 



Это сообщение отредактировал(а) volatile - 30.3.2012, 02:19
PM MAIL   Вверх
Earnest
Дата 30.3.2012, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



_Y_, 
число с плавающей точкой хранится в виде нормализованной мантиссы и порядка, 
как уже объяснил baldina
Что касается поста volatile, речь обычно идет о видимости, об отображении (чтобы не пугать пользователя числами типа 2.999999998 и не объяснять, что это то же самое, что 3). По крайней мере, я именно так поняла. В другом контексте "округление" никакого смысла не имеет. 
Кстати, забыла добавить, что с округлением мантиссы при выводе хорошо справляется стара добрая printf c форматом g. Но это для C. 


--------------------
...
PM   Вверх
_Y_
Дата 30.3.2012, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Цитата(volatile @  30.3.2012,  02:12 Найти цитируемый пост)
оскольку double это двоичный формат, то рассуждения на тему округления его до n десятичных чисел, смысла не имеют.


Врошу прощения. Ввел сумятицу. Не хотел плодить темы, добавил свой вопрос в старую. В результате, Вы отвечаете на первый пост, написанный больше двух лет назад. Каюсь smile 

Earnest, скорее всего, я во что-то не въезжаю в твоем ответе. Я говорю здесь об огруглении до значащих цифр. Это понятие физическое и происходит (мабуть) из метрологии. К машинному представлению отношения большого не имеющее. Для тех, кто с теорией измерений не знаком, попытаюсь кратко и на примере изложить идею:

Школьной линейкой можно померить длину. Намерим, 255 миллиметров. Можно, конечно, гордиться точностью глаза и утверждать, что разглядел 255,26 миллиметра. Теперь даем эксперту с глазом-алмазом другую школьную линейку. Наизмерял 255,41 миллиметр. Что поделать - линейка не микрометр и в десятках дает ошибку. В результате десятые доли миллиметра измерены с ошибкой, а сотые так вообще смысла не имеют. Так вот, значащие цифры это все достоверные цифры плюс первая, содержащая ошибку: наш пример имеет четыре значащие цифры.

Кстати, нашел в Инете такой пример (к занчащим цифрам отношения не имеет прямого, но задача аналогичная). Имеем цифровой вольтметр, показывающий четыре цифры. Между ними десятичную запятую в нужном месте. Измеряем напряжение, а дальше, в зависимости от напряжения, нужно округлить до того числа цифр, которое помещается на четырехразрядном индикаторе.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Earnest
Дата 30.3.2012, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Да все правильно. Число 12345 и число 123.45 имеют одно и то же число значащих цифр. И мантисса у них одинаковая будет: 1.2345, только порядки разные (то в какой степени 10, на который она умножается). Первое число обычно записывается (в нормализованном виде) 1.2345E5, второе - 1.2345E2. И у числа 1234500000000 ровно такое же количество значащих цифр.
Т.е. отличие только в порядке. Это не машинное представление. Но и машинное тоже не с неба свалилось: там то же самое, но порядок двоичный и мантисса от 0 до 1. 
Да, и замечание volatile насчет уместности округления только в контексте вывода никуда не девается, пока ты сидишь за монитором, а не переходишь на счеты. Ибо некоторые числа, какими бы круглыми они не казались в десятичном виде, точно в двоичном не представляются.


--------------------
...
PM   Вверх
_Y_
Дата 30.3.2012, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Earnest, спасибо. Теперь речи ваши оставили след в моем сознании smile

Ну задачу я, вроде, решил давно. А теперь вот и уровень своего понимания повысил smile 





--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


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

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


 




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


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

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