|

Извлечение квадратного корня в 1С


Содержание:

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 секунды, что медленнее, чем вычисление встроенной функцией, но имеет плюс, заключающийся в возможности задать определённую степень точности вычисления.

         В большинстве случаев рациональнее будет использовать встроенную функцию, однако, если есть потребность в задании точности вычисления, то разумно пожертвовать некоторой долей производительности, в обмен на большую гибкость и прозрачность алгоритма.

Специалист компании ООО “Кодерлайн”,

Астанов Артём


Помогла ли вам статья? Оставьте свой комментарий:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Блог про 1С:Предприятие

Copyright © 2024 TopKoder

Мы занимаемся внедрением и обслуживанием программных продуктов 1С.