Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Для новичков > Проблема с точностью |
Автор: Ares4322 3.9.2011, 12:49 | ||
Доброго времени суток! Есть программа. Она должна выводить число с точностью 10 знаков после запятой. Но для 100000 циклов она выводит inf. Что за inf т как сделать, чтобы она выводила в итоге число с точностью 10 знаков после запятой?
|
Автор: Ares4322 3.9.2011, 13:03 | ||
Я поясню. Решаю сейчас задачи из учебника на точность. И там такой код:
По заданию его нужно исправить, чтобы он выводил значение s += 1/(i*i) от 1 до 10000 с точностью до 10 знаков после запятой. Этот код выводит inf. Я его переделал в вышепредставленный. Он тоже выводит inf. И я не могу понять, как мне выполнить задание. |
Автор: boostcoder 3.9.2011, 13:30 |
ааа, понял) |
Автор: Ares4322 3.9.2011, 13:35 |
И все-таки, не подскажете, где ошибка и как решить задачу? |
Автор: rodnover 3.9.2011, 13:57 |
http://ru.wikipedia.org/wiki/%D0%A1%D1%83%D0%BC%D0%BC%D0%B0_%D1%80%D1%8F%D0%B4%D0%B0![]() Оно? ---- А не. сейчас. --- Да мозги уже не те. Перепутал степенной ряд с рядом дирихле. И формулу частичной суммы этого ряда в инете оказалось непросто найти. Попробуйте, может получится? |
Автор: Void 3.9.2011, 14:58 |
Определитесь уже. В первом и втором случае переполнение 32-битного int в i * i. |
Автор: volatile 3.9.2011, 15:37 | ||
|
Автор: Фантом 3.9.2011, 15:54 | ||
Что-то Вы странное наворотили. Во-первых, для точности 10 в знаков типа double вполне достаточно. Во-вторых, не надо пользоваться powl(), результат достигается намного проще:
(но именно так - 1.0 нужно для смены типа, (i*i) нельзя, чтобы не вылезти за пределы int). В принципе, для вящей правильности следовало бы поменять порядок суммирования (от больших i к меньшим), но поскольку запас точности double - еще порядков пять лишних, в данном случае это ни на чем не скажется. P.S. Про "странное" - это к исходному сообщению, а не к предыдущему. ![]() |
Автор: Skevalt 3.9.2011, 16:08 | ||||
|
Автор: volatile 3.9.2011, 16:40 |
Но это вовсе не означает что все компиляторы будут корректно обрабатывать данное выражение. По стандарту порядок вычисления может быть любым. И не исключено что сначала будет высислено (i*i), и произойдет переполнение. наиболее переносисый код, все-же |
Автор: Ln78 4.9.2011, 08:45 | ||
Приближённо заменим ряд интегралом. Получим, что остаток будет примерно равен 1/N. Так что, если нужно обеспечить точность 10 в минус десятой, то N должно быть не меньше 10 в десятой. Квадрат – 10 в 20-й. А точность даблов – на несколько порядков меньше. Ещё и погрешность суммирования. Таким способом требуемую точность получить не удастся. P.S. не так понял задачу. Здесь требуется конечная сумма для относительно небольших N. Тогда просто заменить int на double, степенные функции не нужны, только время зря расходуют. |
Автор: mes 4.9.2011, 10:44 |
нужна не "точность расчета", а "точность вывода" : |
Автор: Ares4322 4.9.2011, 11:58 |
Да, нужна именно точность вывода. У меня gcc 4.4.5 и 1/i*i отрабатывает не так, как ожидаешь. В этом и была проблема. Версии http://forum.vingrad.ru/index.php?showtopic=337389&view=findpost&p=2397219 и http://forum.vingrad.ru/index.php?showtopic=337389&view=findpost&p=2397221 работают. Теперь знаю, что порядок вычисления арифметических выражений может быть не таким, каким ты его ожидаешь. И что желательно явно приводить типы. Спасибо! |