Обсуждение:Язык Си в примерах/Корень уравнения

Материал из Викиучебника — открытых книг для открытого мира
Перейти к навигации Перейти к поиску

D-504 15:00, 24 августа 2009 (UTC) Алгоритм показанный здесь применим не ко всем уравнениям, а точнее он может делать не всегда правильный выбор в[ответить]

   if( f(c) * f(r) < 0 )
            l = c;
         else
            r = c;

т.к. здесь не учитывается тот факт, что в компьютерах числа представляются не совсем "обычным образом", так, например, при умножении ненулевого очень малого по модулю числа на ненулевое очень малое по модулю число, в компьютере возможно получение нуля! Так, например, если представить себе график такой кривой, что она при значениях аргумента, больших значения аргумента корня, имеет производную близкую к нулю (т.к. фактически кривая "параллельна" оси ох)... а слева от корня имеет достаточно "большую" производную, то при нахождения корня данным алгоритмом мы получим некую точку, коротая может находиться на всевозможно как большом или малом расстоянии, т.е. алгоритм не применим. Для того чтобы данный алгоритм был применим к любому графику, который имеет одного знака первую производную и одного знака вторую производную на всём сегменте, надо производить сравнение другого рода.


    if( f(c) * f(с-eps) < 0 )
           l = c;
        else
           r = c;

Данное изменение решает данную проблему.