Содержание:
1. Определение и способы извлечения квадратного корня
2. Варианты реализации в программе 1С
Определение и способы извлечения квадратного корня
Корень числа – это число, возведённое в определённую дробную степень, где числитель – единица, а знаменатель – степень корня.
Квадратный корень – наиболее распространённый в вычислениях и программировании вид корня, степень которого равна 2. То есть, квадратный корень из числа a – то же самое, что и .
Существует множество методов извлечения квадратного корня, но сегодня мы реализуем итерационный аналитический алгоритм на основе формулы Герона.
Варианты реализации в программе 1С
В 1С, начиная с версии 8.0 доступна функция глобального контекста Sqrt(). В качестве параметра функция принимает аргумент, и возвращает извлечённое из-под корня число:
КвадратныйКорень = Sqrt(Аргумент);
В данном случае КвадратныйКорень – это поле формы, в которое будет выводиться извлечённое значение, а Аргумент – поле формы, в которое вводится значение аргумента.
Вычислим значение с помощью встроенной функции и замерим производительность и точность.
Вычистить встроенной функцией
Замерим производительность и точность
Вычисление заняло 0,000105 секунды. На основании того, что функция вычислялась настолько быстро, можно предположить, что на определённом моменте происходит округление. Однако, это не является истиной, и проверить это можно, попытавшись извлечь иррациональный корень:
Вычистить встроенной функцией
Извлечь иррациональный корень
Время исполнения не претерпело существенного ухудшения, а результат рассчитался вплоть до указанной точности поля формы.
Теперь реализуем собственный механизм извлечения квадратного корня. Формируем прямоугольник со сторонами a=1 и b=X. Площадь этого прямоугольника равна S = a * b = X * 1 = X. Преобразуем прямоугольник в квадрат так, что его площадь остаётся прежней, получаем длину стороны, равную корню квадратному из площади фигуры, которая равна Х.
Каждая итерация преобразования прямоугольника в квадрат производится следующим образом:
S = a0 b0;
Создаём новый четырёхугольник, который имеет одну сторону, равную среднему арифметическому сторон текущего прямоугольника, но площадь такую же:
S = a1 b1, где a1 = (a0+b0) / 2, а b1=S / a1
S = a2 b2, где a2 = (a1+b1) / 2, а b2=S / a2
…
S = an bn, где an = (an-1+bn-1) / 2, а bn=S / an
И так до тех пор пока не |an-bn| < Eps.
В коде это будет выглядеть следующим образом:
Функция ИзвлечьКорень(Аргумент)
Эпсилон = Pow(1,-7);
Площадь = Аргумент;
а = 1;
б = Аргумент;
Модуль =?((а-б)>0,(а-б),-(а-б));
Пока (Модуль > Эпсилон) Цикл
а = (а+б)/2;
б = Площадь / а;
Модуль =?((а-б)>0,(а-б),-(а-б));
КонецЦикла;
Возврат (а+б)/2;
КонецФункции
Важным моментом является переопределение модуля на каждой итерации.
Извлечём корень с помощью этой функции и замерим её производительность:
Вычислить алгоритмом
Извлечём корень
В среднем, исполнение данного алгоритма занимает 0,0005 секунды, что медленнее, чем вычисление встроенной функцией, но имеет плюс, заключающийся в возможности задать определённую степень точности вычисления.
В большинстве случаев рациональнее будет использовать встроенную функцию, однако, если есть потребность в задании точности вычисления, то разумно пожертвовать некоторой долей производительности, в обмен на большую гибкость и прозрачность алгоритма.
Специалист компании ООО “Кодерлайн”,
Астанов Артём
Добавить комментарий