![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Ares4322 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 339 Регистрация: 25.9.2007 Где: Россия, Москва Репутация: нет Всего: 3 |
Доброго времени суток!
Есть программа. Она должна выводить число с точностью 10 знаков после запятой. Но для 100000 циклов она выводит inf. Что за inf т как сделать, чтобы она выводила в итоге число с точностью 10 знаков после запятой?
|
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
использовать GMP ;) вы наверное не знаете, что при использовании double, на другой платформе/ОС вы получите немного(а может и много) другой результат ;) |
|||
|
||||
Ares4322 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 339 Регистрация: 25.9.2007 Где: Россия, Москва Репутация: нет Всего: 3 |
Я поясню. Решаю сейчас задачи из учебника на точность. И там такой код:
По заданию его нужно исправить, чтобы он выводил значение s += 1/(i*i) от 1 до 10000 с точностью до 10 знаков после запятой. Этот код выводит inf. Я его переделал в вышепредставленный. Он тоже выводит inf. И я не могу понять, как мне выполнить задание. |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
ааа, понял)
|
|||
|
||||
Ares4322 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 339 Регистрация: 25.9.2007 Где: Россия, Москва Репутация: нет Всего: 3 |
И все-таки, не подскажете, где ошибка и как решить задачу?
|
|||
|
||||
rodnover |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 7.4.2009 Репутация: 2 Всего: 10 |
http://ru.wikipedia.org/wiki/%D0%A1%D1%83%...%8F%D0%B4%D0%B0
![]() Оно? ---- А не. сейчас. --- Да мозги уже не те. Перепутал степенной ряд с рядом дирихле. И формулу частичной суммы этого ряда в инете оказалось непросто найти. Попробуйте, может получится? Это сообщение отредактировал(а) rodnover - 3.9.2011, 14:27 |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 2 Всего: 173 |
Определитесь уже. В первом и втором случае переполнение 32-битного int в i * i. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
|
|||
|
||||
Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 4 Всего: 49 |
Что-то Вы странное наворотили. Во-первых, для точности 10 в знаков типа double вполне достаточно. Во-вторых, не надо пользоваться powl(), результат достигается намного проще:
(но именно так - 1.0 нужно для смены типа, (i*i) нельзя, чтобы не вылезти за пределы int). В принципе, для вящей правильности следовало бы поменять порядок суммирования (от больших i к меньшим), но поскольку запас точности double - еще порядков пять лишних, в данном случае это ни на чем не скажется. P.S. Про "странное" - это к исходному сообщению, а не к предыдущему. ![]() Это сообщение отредактировал(а) Фантом - 3.9.2011, 15:56 |
|||
|
||||
Skevalt |
|
||||
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 30.11.2006 Репутация: нет Всего: 3 |
|
||||
|
|||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Но это вовсе не означает что все компиляторы будут корректно обрабатывать данное выражение. По стандарту порядок вычисления может быть любым. И не исключено что сначала будет высислено (i*i), и произойдет переполнение. наиболее переносисый код, все-же |
|||
|
||||
Ln78 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: нет Всего: 15 |
Приближённо заменим ряд интегралом. Получим, что остаток будет примерно равен 1/N. Так что, если нужно обеспечить точность 10 в минус десятой, то N должно быть не меньше 10 в десятой. Квадрат – 10 в 20-й. А точность даблов – на несколько порядков меньше. Ещё и погрешность суммирования. Таким способом требуемую точность получить не удастся. P.S. не так понял задачу. Здесь требуется конечная сумма для относительно небольших N. Тогда просто заменить int на double, степенные функции не нужны, только время зря расходуют. Это сообщение отредактировал(а) Ln78 - 4.9.2011, 08:49 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
нужна не "точность расчета", а "точность вывода" : |
|||
|
||||
Ares4322 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 339 Регистрация: 25.9.2007 Где: Россия, Москва Репутация: нет Всего: 3 |
Да, нужна именно точность вывода.
У меня gcc 4.4.5 и 1/i*i отрабатывает не так, как ожидаешь. В этом и была проблема. Версии http://forum.vingrad.ru/index.php?showtopi...t&p=2397219 и http://forum.vingrad.ru/index.php?showtopi...t&p=2397221 работают. Теперь знаю, что порядок вычисления арифметических выражений может быть не таким, каким ты его ожидаешь. И что желательно явно приводить типы. Спасибо! |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |