Tooprogram.ru

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Язык си квадратный корень

Язык Си в примерах/Корень уравнения

Задача: Рассмотрим трансцендентное уравнение, которое не имеет явной формулы для корня: e x = x + 2. =x+2.,!> С помощью компьютера необходимо найти положительный корень этого уравнения с погрешностью по оси x не более 10 − 10 ,!> .

Вот решение этой задачи:

При компиляции этой программы с помощью GCC следует указать опцию -lm , которая указывает что при компоновке программы необходимо подключить библиотеку libm с математическими функциями:

В библиотеке mlib , в частности, определена функция exp , вычисляющая экспоненту, а также многие другие математические функции: тригонометричекие ( sin , cos , asin , acos , tan , . ), корень ( sqrt ), степень ( pow ), логарифм ( log ), .

Директива #define EPS 1e-10 означает: в тексте программы идентификатор EPS заменить на число 1e-10 , то есть 1 ⋅ 10 − 10 ,!> . Число EPS — это погрешность по оси x , с которой мы хотим найти корень.

Алгоритм вычисления корня основан на методе деления пополам: Предположим, что искомый корень находится между l = 0 и r = 2 . Найдем середину c отрезка [l, r] . Корень находится на одном из отрезков: либо на [l, c] , либо на [с, r] , а именно, на том, значение функции на концах которого имеет разные знаки (вспомните теорему Ролля про непрерывную функцию из курса мат. анализа). Выберем нужный из двух отрезков и применим к нему такие же рассуждения. Будем осуществлять деление пополам, пока размер отрезка не станет меньше необходимой точности. (В методе деления отрезка пополам отрезок на оси x делится пополам пока varepsilon _>»> | f ( x c ) | > ε f )|>varepsilon _> varepsilon _>»/> , в приведённом же методе отрезок на оси x может достичь заданной величины ε x > , а значения функций f ( x ) (особенно крутых) на оси y могут очень далеко отстоять от нуля, при пологих же функциях f ( x ) этот метод приводит к большому числу лишних вычислений.)

Вопросы и задачи [ править ]

  • За один шаг длина отрезка [l, r] уменьшается в два раза. Сколько нужно шагов, чтобы уменьшить отрезок более, чем в 1000 раз?
  • Сколько требуется шагов, чтобы начиная с отрезка длины r − l = 2 дойти до отрезка длины меньше 10 − 10 ,!>? Сколько требуется шагов, чтобы найти корень с точностью до 100 знаков после запятой?
  • В случае деления пополам у нас есть нижняя и верхняя граница для значения корня. С каждым шагом эти границы сближаются. В методе Ньютона нахождения корня уравнения у нас имеется одно число x — текущее приближение корня. И следующее приближение получается по следующему алгоритму: находим точку на графике с абсциссой x и проводим из неё касательную к графику; абсцисса точки пересечения касательной с осью абсцисс будет новым значением x. Так делается до тех пор, пока новое x отличается от старого на число меньше, чем 10 − 10 / 2 /2,!>. Реализуйте этот алгоритм. Для этого вам понадобится определить еще одну функцию, которая возвращает значение производной f ′ ( x ) = ( e x − x − 2 ) ′ = e x − 1 -x-2)’=e^-1,!>.

Универсальная функция вычисления корня [ править ]

В рассмотренной программе вычисляется нуль вполне конкретной функции: f(x) = exp(x) — 2 — x. Следуя идеологии Code reuse (повторное использование кода), полезно сделать функцию, которая умеет находить нули произвольных функций. Для этого нужно научиться передавать функцию в качестве аргумента — это возможно, и совсем несложно:

Вывод программы выглядит следующим образом:

Функции в языке Си

Функция — это самостоятельная единица программы, которая спроектирована для реализации конкретной подзадачи.
Функция является подпрограммой, которая может содержаться в основной программе, а может быть создана отдельно (в библиотеке). Каждая функция выполняет в программе определенные действия.

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

Семантика функции определяет способ реализации функции. Обычно представляет собой тело функции.

Определение функции

Каждая функция в языке Си должна быть определена, то есть должны быть указаны:

  • тип возвращаемого значения;
  • имя функции;
  • информация о формальных аргументах;
  • тело функции.

Определение функции имеет следующий синтаксис:

Пример : Функция сложения двух вещественных чисел

В указанном примере возвращаемое значение имеет тип float . В качестве возвращаемого значения в вызывающую функцию передается значение переменной y . Формальными аргументами являются значения переменных x и z .

Если функция не возвращает значения, то тип возвращаемого значения для нее указывается как void . При этом операция return может быть опущена. Если функция не принимает аргументов, в круглых скобках также указывается void .

Различают системные (в составе систем программирования) и собственные функции.

Системные функции хранятся в стандартных библиотеках, и пользователю не нужно вдаваться в подробности их реализации. Достаточно знать лишь их сигнатуру. Примером системных функций, используемых ранее, являются функции printf() и scanf() .

Собственные функции — это функции, написанные пользователем для решения конкретной подзадачи.

Разбиение программ на функции дает следующие преимущества:

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

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

Вызов функции

Общий вид вызова функции

Фактический аргумент — это величина, которая присваивается формальному аргументу при вызове функции. Таким образом, формальный аргумент — это переменная в вызываемой функции, а фактический аргумент — это конкретное значение, присвоенное этой переменной вызывающей функцией. Фактический аргумент может быть константой, переменной или выражением. Если фактический аргумент представлен в виде выражения, то его значение сначала вычисляется, а затем передается в вызываемую функцию. Если в функцию требуется передать несколько значений, то они записываются через запятую. При этом формальные параметры заменяются значениями фактических параметров в порядке их следования в сигнатуре функции.

Возврат в вызывающую функцию

По окончании выполнения вызываемой функции осуществляется возврат значения в точку ее вызова. Это значение присваивается переменной, тип которой должен соответствовать типу возвращаемого значения функции. Функция может передать в вызывающую программу только одно значение. Для передачи возвращаемого значения в вызывающую функцию используется оператор return в одной из форм:

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

Оператор return также завершает выполнение функции и передает управление следующему оператору в вызывающей функции. Оператор return не обязательно должен находиться в конце тела функции.

Функции могут и не возвращать значения, а просто выполнять некоторые вычисления. В этом случае указывается пустой тип возвращаемого значения void , а оператор return может либо отсутствовать, либо не возвращать никакого значения:

Пример : Посчитать сумму двух чисел.

В языке Си нельзя определять одну функцию внутри другой.

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

  • тип возвращаемого значения;
  • имя функции;
  • типы формальных аргументов в порядке их следования.

Прототип необходим для того, чтобы компилятор мог осуществить проверку соответствия типов передаваемых фактических аргументов типам формальных аргументов. Имена формальных аргументов в прототипе функции могут отсутствовать.

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

Рекурсивные функции

Функция, которая вызывает сама себя, называется рекурсивной функцией .

Рекурсия — вызов функции из самой функции.

Пример рекурсивной функции — функция вычисления факториала.

Результат выполнения

Более подробно рекурсивные функции рассмотрены в этой статье.

Математические функции

Математические функции хранятся в стандартной библиотеке math.h . Аргументы большинства математических функций имеют тип double . Возвращаемое значение также имеет тип double .
Углы в тригонометрических функциях задаются в радианах.

Основные математические функции стандартной библиотеки.

ФункцияОписание
int abs( int x)Модуль целого числа x
double acos( double x)Арккосинус x
double asin( double x)Арксинус x
double atan( double x)Арктангенс x
double cos( double x)Косинус x
double cosh( double x)Косинус гиперболический x
double exp( double x)Экспонента x
double fabs( double x)Модуль вещественного числа
double fmod( double x, double y)Остаток от деления x/y
double log( double x)Натуральный логарифм x
double log10( double x)Десятичный логарифм x
double pow( double x, double y)x в степени y
double sin( double x)Синус x
double sinh( double x)Синус гиперболический x
double sqrt( double x)Квадратный корень x
double tan( double x)Тангенс x
double tanh( double x)Тангенс гиперболический x

Особенности использования функций в языке C++ рассмотрены в этой статье.

Язык Си в примерах/Корень уравнения

Задача: Рассмотрим трансцендентное уравнение, которое не имеет явной формулы для корня: e x = x + 2. =x+2.,!> С помощью компьютера необходимо найти положительный корень этого уравнения с погрешностью по оси x не более 10 − 10 ,!> .

Вот решение этой задачи:

При компиляции этой программы с помощью GCC следует указать опцию -lm , которая указывает что при компоновке программы необходимо подключить библиотеку libm с математическими функциями:

В библиотеке mlib , в частности, определена функция exp , вычисляющая экспоненту, а также многие другие математические функции: тригонометричекие ( sin , cos , asin , acos , tan , . ), корень ( sqrt ), степень ( pow ), логарифм ( log ), .

Директива #define EPS 1e-10 означает: в тексте программы идентификатор EPS заменить на число 1e-10 , то есть 1 ⋅ 10 − 10 ,!> . Число EPS — это погрешность по оси x , с которой мы хотим найти корень.

Алгоритм вычисления корня основан на методе деления пополам: Предположим, что искомый корень находится между l = 0 и r = 2 . Найдем середину c отрезка [l, r] . Корень находится на одном из отрезков: либо на [l, c] , либо на [с, r] , а именно, на том, значение функции на концах которого имеет разные знаки (вспомните теорему Ролля про непрерывную функцию из курса мат. анализа). Выберем нужный из двух отрезков и применим к нему такие же рассуждения. Будем осуществлять деление пополам, пока размер отрезка не станет меньше необходимой точности. (В методе деления отрезка пополам отрезок на оси x делится пополам пока varepsilon _>»> | f ( x c ) | > ε f )|>varepsilon _> varepsilon _>»/> , в приведённом же методе отрезок на оси x может достичь заданной величины ε x > , а значения функций f ( x ) (особенно крутых) на оси y могут очень далеко отстоять от нуля, при пологих же функциях f ( x ) этот метод приводит к большому числу лишних вычислений.)

Вопросы и задачи [ править ]

  • За один шаг длина отрезка [l, r] уменьшается в два раза. Сколько нужно шагов, чтобы уменьшить отрезок более, чем в 1000 раз?
  • Сколько требуется шагов, чтобы начиная с отрезка длины r − l = 2 дойти до отрезка длины меньше 10 − 10 ,!>? Сколько требуется шагов, чтобы найти корень с точностью до 100 знаков после запятой?
  • В случае деления пополам у нас есть нижняя и верхняя граница для значения корня. С каждым шагом эти границы сближаются. В методе Ньютона нахождения корня уравнения у нас имеется одно число x — текущее приближение корня. И следующее приближение получается по следующему алгоритму: находим точку на графике с абсциссой x и проводим из неё касательную к графику; абсцисса точки пересечения касательной с осью абсцисс будет новым значением x. Так делается до тех пор, пока новое x отличается от старого на число меньше, чем 10 − 10 / 2 /2,!>. Реализуйте этот алгоритм. Для этого вам понадобится определить еще одну функцию, которая возвращает значение производной f ′ ( x ) = ( e x − x − 2 ) ′ = e x − 1 -x-2)’=e^-1,!>.

Универсальная функция вычисления корня [ править ]

В рассмотренной программе вычисляется нуль вполне конкретной функции: f(x) = exp(x) — 2 — x. Следуя идеологии Code reuse (повторное использование кода), полезно сделать функцию, которая умеет находить нули произвольных функций. Для этого нужно научиться передавать функцию в качестве аргумента — это возможно, и совсем несложно:

Вывод программы выглядит следующим образом:

Стандартные математические функции в языке Си

Пожалуйста, приостановите работу AdBlock на этом сайте.

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

Для использования математических функций нужно подключить заголовочный файл math.h . В ней определено много различных функций, но мы пока рассмотрим следующие:

Некоторые математические функции

fabs(x) модуль числа x
sqrt(x) квадратный корень из числа x
sin(x) синус числа x (х в радианах)
cos(x) косинус числа x (х в радианах)
pow(x, y) вычисление x y
exp(x) вычисление e x
log(x) натуральный логарифм числа x
log10(x) десятичный логарифм числа x

Два важных момента.

  • Все функции возвращают значение типа double .
  • Параметры функций – вещественные числа( double ), но можно передавать и целые числа. При этом произойдёт неявное преобразование типа . Компилятор из целого числа, например 3, сделает вещественное 3.0.

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

Вычислить синус угла ввёденного с клавиатуры. Угол вводится в градусах.

В этой программе есть о чём поговорить. Тригонометрические функции, которые определены в math.h работают с радианной мерой угла. Людям же привычнее работать с градусами. Поэтому в данной программе мы предварительно перевели значение из градусов в радианы. Если этого не сделать, результат получится неправильным. Проверьте это самостоятельно.

Неявное преобразование типов

При явном преобразовании типа мы в скобках перед значением указывали тип, к которому нужно привести данное значение. В неявном преобразовании этого делать не нужно. Компилятор автоматически подберёт необходимый тип.

Неявное преобразование типов осуществляется в следующих случаях:

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

Правила неявного преобразования типов

  • если выполняются арифметические операции с разными типами аргументов. Оба аргумента приводятся к большему типу.
    Порядок типов: int float double
  • при присваивании. Значение справа от оператора присваивания приводится к типу переменной слева от оператора присваивания. При этом, если больший тип присваивается меньшему, то может произойти потеря точности.

int+float будет автоматически преобразовано к float+float
float/int будет автоматически преобразовано к float/float
double*float будет преобразовано к double*double
int = double double будет преобразовано к int с потерей дробной части
float = int int будет преобразовано к float

Практика

Решите предложенные задачи:

Для удобства работы сразу переходите в полноэкранный режим

Читать еще:  Ошибка sql таблица не найдена 1с
Ссылка на основную публикацию
Adblock
detector