Простейшая математика в Си

Пример 1 - Один из алгоритмов вычисления числа \(\pi\)

В качестве первого примера напишем программу, вычисляющую число \(\pi\) следующим образом: \[ \pi = 4\sum_{i=1}^\infty\frac{(-1)^{i+1}}{2i-1} = 4\left(1 - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + \dots \right). \]

Наберите текст предлагаемой программы. Обратите внимание на цикл for! В нем необходимо найти и раскомментировать правильную строку.

$ vim pi.c

pi.c.png

Компилируем, запускаем программу несколько раз, вводя различные значения N:

$ gcc pi.c -o pi
$ ./pi

Что такое M_PI? Что можно сказать о сходимости используемого в программе ряда? Насколько рассмотренный алгоритм "удобный" для вычисления \(\pi\)?

Пример 2 - Вычисление определенного интеграла методом прямоугольников

Теперь вычислим численно значение определённого интеграла методом прямоугольников: \[ \int\limits_a^bf(x)\,dx \approx \sum_{i=1}^N f(x_i)\cdot \Delta x,\qquad x_1 = a,\quad x_i = x_1 + i\cdot\Delta x,\quad \Delta x = \frac{b-a}{N}. \]

Наберите текст предлагаемой программы, обращая внимание на использование функций и макроопределений:

$ vim integral.c

integral.c.png

Транслируйте программу, запустите её несколько раз, меняя параметры a, b и N:

$ gcc integral.c -o integral
$ ./integral

Проверьте непосредственным вычислением корректность работы программы. В чём главный недостаток программы с точки зрения пользователя? Прокомментируйте заголовок цикла for. Всё ли вам понятно в приведённом примере?

Пример 3 - Простейшие тригонометрические функции

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

$ vim trig.c

trig.c.png

Обратите внимание на то, что англоязычные названия общеизвестных функций могут отличаться от русскоязычной традиции, например тангенс это не \(\text{tg}\,x\), а \(\tan x\) и т.д.

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

$ gcc trig.c -o trig -lm
$ ./trig

Пример 4 - Округление до целого

Достаточно часто возникает необходимость округлять дробные числа до целых. Стандартная библиотека Си поддерживает три основных функции, необходимых для этого. Поэтому для начала ознакомьтесь с докуменацией по функциям ceil(), floor(), rint():

$ man ceil
$ man floor
$ man rint

Чем все эти функции отличаются друг от друга? После того, как ответите на этот вопрос, наберите текст программы:

$ vim rounding.c

rounding.c.png

Скомпилируйте и запустите программу несколько раз:

$ gcc rounding.c -o rounding -lm
$ ./rounding

Попробуйте ввести значения x=9.7, x=3.1, x=2.5, x=3.5. Результаты объясните.

Пример 5 - Степенная, показательная функции и экспонента

Наберите в редакторе текст программы:

$ vim raising.c

raising.c.png

Скомпилируйте и запустите программу:

$ gcc raising.c -o raising -lm
$ ./raising

Объясните алгоритм работы программы. Изучите документацию по функции pow():

$ man pow

Какие могут возникнуть проблемы при использовании функции pow()?

Пример 6 - Натуральный и десятичный логарифмы

$ vim log-1.c

log-1.c.png

$ gcc log-1.c -o log-1 -lm
$ ./log-1
$ man log

Пример 7 - Второй вариант вычисления логарифма

$ vim log-2.c

log-2.c.png

$ gcc log-2.c -o log-2 -lm
$ ./log-2

Пример 8 - Модуль целых, вещественных и комплексных чисел

$ vim abs-2.c

abs-2.c.png

$ gcc abs-2.c -o abs-2 -lm
$ ./abs-2
$ man abs
$ man fabs
$ man cabs
$ man complex