Функция вычисляющая квадратный корень

Функция вычисляющая квадратный корень

Представленный алгоритм был создан в те бородатые времена, когда производительность x87 оставляла желать лучшего. Но и сейчас, скорость работы этого алгоритма соизмерима со скоростью вычисления с плавающей точкой на PII или MMX. На мой взгляд, материал может быть интересен, как начинающим программистам — пусть учатся писать программы, а не ломать их, и не вирусы, так и опытным — как игра ума. Тест, скомпилированный MSVC 5.0, на PII-233×2 дает следующие результаты:

Задача вычисление квадратного корня при построении программ достаточна тривиальная. Функция для ее решения — sqrt — присутствует практически в любом из современных языков программирования. Однако практика использования функции sqrt показала, что данная функция ведет себя совершенно различным способом для целочисленных и действительных аргументов.

Результат выполнения кода приведенного в примере 1 выглядит так:

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

Известно, многие сталкивались с подобной проблемой при построении целочисленных расчетных задач. Как правило, эта проблема решается написанием собственной функции, возвращающей правильный результат, т.е. результат, округленный до ближайшего целого, вместо отбрасывания дробной части. Один из вариантов собственной функции приведен в примере 2.

Функция, приведенная в примере 2, дает абсолютно правильные значения для всех целых чисел согласно принятым правилам округления. Однако возникает вопрос: возможно ли получение правильных результатов при использовании целочисленных алгоритмов?

Самый известный целочисленный алгоритм для вычисления квадратного корня из числа поражает своей простотой и приведен в примере 3.

Результат работы алгоритма из примера 3 идентичен результату из примера 1 — отбрасывание дробной части. Кроме того, невооруженным глазом виден еще один недостаток данного алгоритма — количество итераций в цикле соответствует значению вычисленного квадратного корня от аргумента L:

Читайте также:  Как удалить eset endpoint antivirus с компьютера

Рассматривая задачу вычисления квадратного корня с точки зрения уменьшения величины вычислительных затрат, более привлекателен целочисленный алгоритм, реализующий формулу Ньютона — пример 4.

Количество итераций в цикле для алгоритма из примера 4 приблизительно будет равняться натуральному логарифму от аргумента L:

Легко заключить, что разница в значениях формул (1) и (2) достаточна велика особенно для больших чисел, что и иллюстрирует ниже приведенная таблица.

Число L sqrt_cpu_int sqrt_cpu_newton
70000 264 11
300000 574 13
700000 836 13
990000 994 14

Однако результат работы алгоритма из примера 4 опять тот же — округление до целого числа отбрасыванием дробной части. Анализ кода алгоритма показывает, что наибольшая ошибка при вычислениях накапливается в главной формуле алгоритма и возникает при целочисленном делении на 2 без учета остатка от деления. В примере 5 приведен модифицированный алгоритм вычисления квадратного корня, с учетом вышеупомянутого замечания.

В модифицированный алгоритм добавлена одна переменная и две новые строки, реализующие целочисленное деление на 2 с учетом остатка. Модифицированный алгоритм вычисляет правильные значения — корень от аргумента с округлением до ближайшего целого практически для всех значений аргумента за исключением определенного ряда чисел. Для чисел этого ряда корень вычисляется, как число на единицу большее, чем истинное целочисленное его значение, определенное по общепринятым правилам округления (см. таблицу).

Число 2 6 12 20 30 42 56 72 90 110 132
Действит. Корень 1,4 2,4 3,4 4,4 5,4 6,4 7,4 8,4 9,4 10,4 11,4
Целый Корень 1 2 3 4 5 6 7 8 9 10 11
Вычисл. Корень 2 3 4 5 6 7 8 9 10 11 12

Для всех аргументов алгоритма из приведенного ряда характерно, что вычисленное алгоритмом значение — есть целочисленный множитель, произведение которого с истинным целочисленным значением квадратного корня от аргумента дает сам аргумент. Знание выявленной закономерности позволяет сделать последнюю модификацию алгоритма, позволяющую окончательно устранить ошибки в вычислениях. Модификация заключается в проверке условия для выполнения коррекции результата вычисления при завершении работы алгоритма — пример 6.

Читайте также:  Программа для усиления микрофона windows 7

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

В заключении следует отметить о существовании еще одной модификации алгоритма. На этот раз модификация преследует только задачу повышения производительности алгоритма. Повысить производительность итерационных алгоритмов возможно только одним способом — уменьшить количество итераций. Для приведенного в примере 6 алгоритма количество итераций можно значительно снизить, более точно подобрав начальные значения для переменной div — пример 7.

Последняя модификация алгоритма (пример 7) вычисляет квадратный корень из числа без ошибок округления на диапазоне [0..10000] в среднем за 3 итерационных цикла. В таблице ниже представлена сводная таблица по вычислительным затратам алгоритма на исследуемом диапазоне. На других диапазонах аргумента количество итераций не бывает больше 6, а в среднем равняется 3. Сравнивая с первоначально достигнутыми результатами, см. таблицу в начале, можно сказать, что достигнуто увеличение производительности как минимум в 2 — 4 раза.

Определение

Возвращает квадратный корень из указанного числа. Returns the square root of a specified number.

Параметры

Число, квадратный корень которого требуется найти. The number whose square root is to be found.

Возвращаемое значение

Одно из значений, перечисленных в следующей таблице. One of the values in the following table.

Параметр d d parameter Возвращаемое значение Return value
Нуль или положительное число Zero or positive Положительный квадратный корень из d . The positive square root of d .
Отрицательное число Negative NaN
Равняется NaN Equals NaN NaN
Равняется PositiveInfinity Equals PositiveInfinity PositiveInfinity

Примеры

Квадратный корень области квадрата представляет длину любой стороны квадрата. The square root of the area of a square represents the length of any side of the square. В следующем примере отображается область некоторых городов в США и приводится впечатление, что размер каждого города представлен квадратом. The following example displays the area of some cities in the United States and gives an impression of each city’s size if it were represented by a square.

Читайте также:  Найти icloud по номеру телефона

Возвращает значение типа Double, указывающее квадратный корень числа.

Требуемое числоаргумент — это значение типа Double или любое допустимое числовое выражение, большее или равное нулю.

Пример запроса

ВЫБЕРИТЕ UnitPrice, SQR (UnitPrice) как Скрунитприце из Продуктсалес;

Возвращает значения из "UnitPrice" и их квадратный корень в столбце Скрунитприце.

Пример VBA

Примечание: В примерах ниже показано, как использовать эту функцию в модуле Visual Basic для приложений (VBA). Чтобы получить дополнительные сведения о работе с VBA, выберите Справочник разработчика в раскрывающемся списке рядом с полем Поиск и введите одно или несколько слов в поле поиска.

В этом примере функция SQR используется для вычисления квадратного корня числа.

Примечание: Эта страница переведена автоматически, поэтому ее текст может содержать неточности и грамматические ошибки. Для нас важно, чтобы эта статья была вам полезна. Была ли информация полезной? Для удобства также приводим ссылку на оригинал (на английском языке).

Ссылка на основную публикацию
Форд экоспорт белый фото
Компания Форд славится тем, что каждое обновление их машин несет в себе кучу перемен. Не стал исключением и недорогой городской...
Установка и настройка ip камеры
Системы видеонаблюдения используются давно. Старые аналоговые решения были дороги и громоздки. Они требовали большого количества дорогостоящего оборудования, квалифицированных специалистов и...
Установка и настройка операционной системы windows
Наши услуги УСТАНОВКА ОПЕРАЦИОННЫХ СИСТЕМ Определения: Операционная система (сокращенно ОС) – комплекс взаимосвязанных программ, предназначенных для управления ресурсами компьютера и...
Форм факторы корпусов пк размеры
Главная FAQ Железо Типы компьютерных корпусов Типы компьютерных корпусов Говоря слово "компьютер" многие подразумевают системный блок компьютера, и в принципе...
Adblock detector