Вычисление функций на последовательностях
Значения "минус" и "плюс бесконечность"
Как реализовать воображаемые элементы "минус бесконечность" и "плюс бесконечность" при программировании на конкретных алгоритмических языках, а не на псевдокоде? Вспомним, что компьютер может представлять не все возможные числа, а только их ограниченное подмножество. Поэтому для компьютера существует минимальное и максимальное целое и вещественное числа. В языке Си эти константы записаны в стандартных заголовочных файлах " limits.h " для целочисленных типов и " float.h " для вещественных типов. Для типа int эти константы называются INT_MIN и INT_MAX.
INT_MIN = (-2147483647 - 1) INT_MAX = 2147483647
Для вещественных типов максимальное и минимальное числа равны по абсолютной величине и отличаются лишь знаками, поэтому специального названия для максимальной по абсолютной величине отрицательной константы не существует. Максимальное число типа float называется FLT_MAX, типа double - DBL_MAX.
FLT_MAX = 3.402823466e+38 DBL_MAX = 1.7976931348623158e+308
Стоит отметить, что через FLT_MIN и DBL_MIN обозначены минимальные положительные числа, а вовсе не максимальные по абсолютной величине отрицательные!
FLT_MIN = 1.175494351e-38 DBL_MIN = 2.2250738585072014e-308 Константа DBL_MAX является нормальным числом, она не равна специальному бесконечно большому значению. Использовать бесконечно большое значение опасно, т.к. операции с ним могут приводить к ошибкам.
Итак, в качестве значений "минус бесконечность" и "плюс бесконечность" можно использовать константы INT_MIN и INT_MAX для типа int. Для типа double в качестве значений "минус бесконечность" и "плюс бесконечность" можно использовать выражения ( -DBL_MAX ) и DBL_MAX. Не забудьте только при программировании на Си подключить стандартные заголовочные файлы:
#include <limits.h>
для целых типов и
#include <float.h>
для вещественных. Впрочем, вовсе не обязательно помнить названия этих констант и имена стандартных заголовочных файлов. В качестве значения "минус бесконечность" всегда можно использовать произвольное значение, заведомо меньшее, чем любое конкретное число, которое может встретиться в программе. Например, если известно, что программа работает только с неотрицательными числами, то в качестве значения "минус бесконечность" можно использовать произвольное отрицательное число, например, минус единицу. Аналогично, в качестве значения "плюс бесконечность" можно применять любое достаточно большое число. Оно должно быть заведомо больше, чем все конкретные числа, которые могут встретиться в алгоритме. Пусть, например, известно, что в программе могут встретиться вещественные числа не больше миллиона. Тогда в качестве значения "плюс бесконечность" можно использовать константу
1.0e+30
т.е. десять в тридцатой степени. (Можно даже использовать 1.0e+7, т.е. десять миллионов, но не стоит мелочиться.)
Схема Горнера
Рассмотрим еще один важный пример функции на последовательности. Пусть дана последовательность коэффициентов многочлена p(x) по убыванию степеней:
p(x) = a0xn +a1xn-1 + ... + an
Нужно вычислить значение многочлена в точке x = t. Алгоритм, основанный на просмотре последовательности коэффициентов в направлении от старшего к младшему, называется схемой Горнера. Проиллюстрируем его идею на примере многочлена третьей степени:
p(x) = ax3+bx2+cx+d
Его можно представить в виде
p(x) = ((ax+b)x+c)x+d
Для вычисления значения многочлена достаточно трех умножений и трех сложений. В общем случае, многочлен представляется в следующем виде:
p(x) = (...((a0x+a1)x+a2)x+...+an-1)x+an.
Обозначим через pk(x) многочлен k -ой степени, вычисленный по коэффициентам a0, a1, ..., ak:
pk(x) = a0xk + a1xk-1 + ... + ak.
Тогда
pk+1(x) = pk(x)x + ak+1
т.е. при считывании нового коэффициента многочлена надо старое значение многочлена умножить на значение x, а затем прибавить к нему новый коэффициент.
вещ алгоритм схема Горнера(вх: цел n, вещ a[n+1], вещ t) | дано: n -- степень многочлена | a[n+1] -- массив коэффициентов многочлена по | убыванию степеней | надо: вычислить значение многочлена в точке t начало алгоритма | вещ p; цел i; | p := 0.0; // Инициализация значения многочлена | i := 0; | цикл пока i <= n | | p := p * t + a[i]; // Вычисление нового значения по | | // старому значению и добавленному коэффициенту | | i := i + 1; | конец цикла | ответ := p; конец алгоритма