Форум программистов, компьютерный форум CyberForum.ru

Возможное округление при нахождении 2-й производной. При повышении точности программа начинает возвращать 0. - C++

Восстановить пароль Регистрация
 
Перцев Роман
0 / 0 / 0
Регистрация: 02.10.2010
Сообщений: 10
05.11.2011, 01:04     Возможное округление при нахождении 2-й производной. При повышении точности программа начинает возвращать 0. #1
Итак, здравствуйте.
Такая проблема.
Существует формула для нахождения 2-й производной функции:
http://www.cyberforum.ru/cgi-bin/latex.cgi?f''(x) = (f(x + h) - 2f(x) + f(x - h)) / (h^2)
Так выглядит ее реализация в виде функции:
C++
1
2
3
4
double SndDiff(double (*func)(double arg), double arg, double accur)
{
            return ((func(arg + accur) - (2. * func(arg)) + func(arg - accur)) / (pow(accur, 2.)));
}
где arg - аргумент функции, а accur - точность вычисления.

При подаче в функцию указателя на функцию, реализующую вычисление многочлена 2-го порядка (например, http://www.cyberforum.ru/cgi-bin/latex.cgi?x^2 + 6x - 3), и accur>=0.0000001, на выходе получаю нормальное значение, принимая во внимание погрешность (в данном примере аналитическое значение производной равно 2 при любом аргументе). Но если accur<=0.00000001, то на выходе получаю 0.(0) (ноль и ноль в периоде).

С остальными типами функций (тригонометрическими, а также с многочленами порядков, выше 2-го) функция работает как надо (проверял в Maple).

Пробовал переделать функции для работы с long double, копался в <float.h>, обойтись без pow(), но ничего не помогло.

Жду ваших советов!
Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2011, 01:04     Возможное округление при нахождении 2-й производной. При повышении точности программа начинает возвращать 0.
Посмотрите здесь:

C++ не могу найти обишку при нахождении макс элемента
При нахождении количества локальных максимумов в последовательности for_each возвращает ноль C++
C++ Что возвращать при делении на ноль?
C++ Увеличение точности при подсчетах
Неправильно выводит результат при нахождении расстояния между отрезками C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
05.11.2011, 02:34     Возможное округление при нахождении 2-й производной. При повышении точности программа начинает возвращать 0. #2
видимо, ф-ция слишком плавная, поэтому ф-ции от x+h и x-h отличаются на столь мизерную величину от функции от x, что она не умещается в double. это можно четко проследить, если установить cout.precision(50) и больше и вывести каждое слагаемое. начиная с 0.00000001 за счет округления типом f(x+h)+f(x-h)=f(x). а значит числитель станет нулем.

наверное, стоит воспользоваться специальными либами с вещественными числами очень большой точности. хотя не понятно, зачем тебе такая огромная точность)
Перцев Роман
0 / 0 / 0
Регистрация: 02.10.2010
Сообщений: 10
05.11.2011, 03:21  [ТС]     Возможное округление при нахождении 2-й производной. При повышении точности программа начинает возвращать 0. #3
Paporotnik, спасибо за совет.
Да она б и не нужна была, эта точность, если бы из-за нее все прахом не шло, плюс в задании к лабе указана степень точности -12.
Меня не банили на гугле, но все-таки спрошу: как зовется такой либ?
Байт
 Аватар для Байт
13993 / 8824 / 1231
Регистрация: 24.12.2010
Сообщений: 15,990
05.11.2011, 11:19     Возможное округление при нахождении 2-й производной. При повышении точности программа начинает возвращать 0. #4
Перцев Роман, Попробуй перехитрить машинную арифметику
C
1
2
3
a = (f(x+h) - f(x))/h;
b = (f(x)-f(x-h))/h;
return (a-b)/h;
Удачи!
Перцев Роман
0 / 0 / 0
Регистрация: 02.10.2010
Сообщений: 10
05.11.2011, 15:15  [ТС]     Возможное округление при нахождении 2-й производной. При повышении точности программа начинает возвращать 0. #5
Не перехитряется.
Yandex
Объявления
05.11.2011, 15:15     Возможное округление при нахождении 2-й производной. При повышении точности программа начинает возвращать 0.
Ответ Создать тему
Опции темы

Текущее время: 09:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru