Эта глава содержит информацию относительно функций предназначенных для выполнения базисных арифметических операций, типа разбивания float на целую и дробную части. Эти функции объявлены в заголовочном файле "math.h ".
Формат ИИЭР с плавающей запятой используемый наиболее современными компьютерами, поддерживает значения, которые являются "не числами". Эти значения называются NaN. Эти значения следуют из некоторых операций, которые не имеют никакого значимого числового результата, типа нуля, деленого на нуль или бесконечности, деления на бесконечность.
Одна примечательная особенность NaN'ов заключается в том, что они не равны себе. Таким образом, x == x может быть 0, если значение x - NaN. Вы можете использовать это, чтобы проверить является ли значение NaN или нет: если оно не равно себе, то это - NaN. Но рекомендуемый способ проверять NaN - isnan функцией (см. Раздел 14.2 [Предикаты на Значениях с Плаваюшей точкой]).
Почти любая арифметическая операция, в которой аргумент является NaN, возвращает NaN.
    double NAN  (макрос)
Вы можете использовать " #ifdef NAN " чтобы проверить, поддерживает ли машина NaN. (Конечно, Вы должны принять меры, чтобы расширения GNU были видимыми, определяя _GNU_SOURCE, и Вы должны включить " math.h ".)
Этот раздел описывает некоторые разнообразные функции-тесты double значений. Прототипы для этих функций появляются в "math.h". Это функции BSD, и таким образом доступны, если Вы определяете _BSD_SOURCE или _GNU_SOURCE.
   int isinf (double x)  (функция)
    int isnan (double x)  (функция)
    int finite (double x)  (функция)
    double infnan (int error)  (функция)
В библиотеке BSD, на некоторых машинах, infnan вызывает фатальный сигнал во всех случаях. Библиотека GNU не делает аналогично, потому что это не удовлетворяет спецификации ANSI C.
Примечание Переносимости: функции, перечисленные в этом разделе - расширения BSD.
Эти функции предусмотрены для получения абсолютного значения (или величины) числа. Абсолютное значение вещественного числа x - x если x положителен, -x, если x отрицателен. Для комплексного числа z, чья вещественная часть является x и чья мнимая часть является y, абсолютное значение - sqrt (x * x + y * y).
Прототипы для abs и labs находятся в " stdlib.h "; fabs и cabs объявлены в " math.h ".
    int abs (int number)  (функция)
Большинство компьютеров использует двоичное дополнение представления integer, в котором абсолютное значение INT_MIN (самый маленький возможный int) не может представляться; таким образом, abs (INT_MIN) не определен.
    long int labs (long int number) (функция)
    double fabs (double number)  (функция)
    double cabs (struct { double real, imag; } z)  (функция)
    sqrt (z.real*z.real + z.imag*z.imag)
Функциям, описанные в этом разделе прежде всего обеспечивают способ эффективно выполнить некоторые манипулирования низкого уровня на числах с плавающей запятой, которые представляются, внутренне используя двоичную систему счисления. Эти функции требуются, чтобы реализовать эквивалентное поведение, даже если представление не использует основание системы счисления 2, но конечно они, вряд ли, будут особенно эффективны в тех случаях.
Все эти функции объявлены в " math.h ".
    double frexp (double value, int *exponent)  (функция)
Если значение аргумента value - не нуль, возвращаемое значение value - число степеней двойки, и всегда в диапазоне от 1/2 (включ.) до 1 (исключ.). Соответствующая экспонента сохранена в *exponent; возвращаемое значение, умноженное на 2 возведенное в эту экспоненту, равняется первоначальному значению числа.
Например, frexp (12.8, &exponent) возвращает 0.8 и сохраняет 4 в exponent.
    double ldexp (double value, int exponent)  (функция)
Например, ldexp (0.8, 4) Возвращает 12.8.
Следующие функции, которые исходят ИЗ BSD, обеспечивают эквиваленты средств ldexp и frexp:
    double scalb (double value, int exponent)
    double logb (double x)
Когда 2 в этой степени разделена на x, это дает частное между 1 (включ.) и 2 (исключ.).
Если x - нуль, значение - минус бесконечность (если машина поддерживает такое значение), или очень малое число. Если x - бесконечность, значение - бесконечность.
Значение, возвращенное logb на один меньше чем то что frexp сохранил бы в *exponent.
    double copysign (double value, double sign) Function
Функции, перечисленные здесь выполняют операции типа округления, усечения, и взятия остаточного члена от деления чисел с плавающей запятой. Некоторые из этих функций преобразовывают числа с плавающей запятой в целочисленные значения. Они все объявлены в " math.h ".
Вы можете также преобразовывать числа с плавающей запятой в integer просто, приводя их к int. Это отбрасывает дробную часть, действительно округляя к нулю. Однако, это работает только, если результат может фактически представляться как int и для очень больших чисел, это невозможно. Функции, перечисленные здесь возвращают результат как double, чтобы обойти эту проблему.
    double ceil (double x)
    double floor (double x)
    double rint (double x)
Режим округления значения по умолчанию к самому близкому целому числу; некоторые машины поддерживают другие режимы, но этот не всегда используется если Вы явно выбираете другой.
    double modf (double value, double *integer_part)
Modf сохраняет целочисленную часть в *integer_part, и возвращает дробную часть. Например, modf (2.5, &intpart) возвращает 0.5 и сохраняет 2.0 в integer_part.
    double fmod (double numerator, double denominator)
Результат имеет тот же самый знак как numerator и имеет величину меньше чем величина denominator.
Если denominator - нуль, fmod сбоит и устанавливает errno как EDOM.
    double drem (double numerator, double denominator)  (функция)
Абсолютное значение результата - меньше или равно половине абсолютного значения denominator. Различие между fmod (numerator, denominator) и drem (numerator, denominator) - всегда либо denominator, либо -denominator, либо нуль.
Если denominator - нуль, drem сбоит и устанавливает errno как EDOM.
Этот раздел описывает функции для выполнения деления целых чисул. Эти функции избыточны в библиотеке GNU C, с тех пор в GNU C, оператор ` / ' всегда округляется к нулю. Но в других реализациях C, " / " может поступать по-другому с отрицательными аргументами. div и ldiv полезны, потому что они определяют как округляется частное: к нулю. Остаточный член имеет тот же самый знак как числитель.
Эти функции определены, чтобы возвратить результат r такой, что значение r.quot*denominator+r.rem равняется numerator.
Чтобы использовать эти средства, Вы должны включить заглавный файл " stdlib.h " в вашей программе.
    div_t                 (тип данных)
    div_t div (int numerator, int denominator)  (функция)
Если результат не может представляться (напр. деление на нуль), поведение не определено.
Вот пример, хотя и не очень полезный.
                        div_t result;
                        result = div (20, -6);
       ldiv_t             (тип данных)
    long int quot
    long int rem
    ldiv_t ldiv (long int numerator, long int denominator)   (функция)
Этот раздел описывает функции для "чтения" целого числа и чисел с плавающей запятой из строки. Может быть более удобно в некоторых случаях использовать sscanf или одну из подобных функций; см. раздел 7.11 [Форматируемый Ввод]. Но часто Вы можете делать программу более надежной, находя лексемы в строке вручную, и преобразуя их в числа один за другим.
Эти функции объявлены в " stdlib.h ".
    long int strtol (const char *string, char **tailptr, int base)   (функция)
Если строка является пустой, содержит только пропуск(и), или не содержит начальную подстроку, которая имеет ожидаемый синтаксис для целого числа с заданным base, никакое преобразование не выполняется. В этом случае, strtol возвращает нулевое значение, а значение, сохраненное в *tailptr - значение строки.
Если строка имеет допустимый синтаксис для целого числа, но значения не представимы из-за переполнения, strtol возвращает или LONG_MAX или LONG_MIN (см. Раздел A. 5.2 [Диапазон Типа]), соответствующее знаку значения. Она также устанавливает errno как ERANGE, чтобы указать, что имелось переполнение.
См. пример в конце этого раздела.
    unsigned long int strtoul (const char *string, char **tailptr, int base)
    long int atol (const char *string)  (функция)
    int atoi (const char *string)  (функция)
Вот функция, которая анализирует строку как последовательность целых и возвращает их сумму:
                int
                sum_ints_from_string (char *string)
                {
                        int sum = 0;
                        while (1) {
                                char *tail;
                                int next;
                                while (isspace (*string)) string++;
                                if (*string == 0)
                                        break;
                                errno = 0;
                                next = strtol (string, &tail, 0);
                                if (errno)
                                        printf ("Overflow\n");
                                else
                                        sum += next;
                                string = tail;
                        }
                        return sum;
                }
Эти функции объявлены в " stdlib.h ".
    double strtod (const char *string, char **tailptr)  (функция)
Эта функция пытается разлагать строку следующим образом:
В этом случае, strtod возвращает нуль, а значение, возвращенное в *tailptr - значение строки.
В стандарте отличном от стандарта "C", эта функция может распознавать дополнительный синтаксис.
Если строка имеет допустимый синтаксис для числа с плавающей запятой, но значения, не представимы из-за переполнения, strtod возвращает или положительный или отрицательный HUGE_VAL (см. Главу 13 [Математика]), в зависимости от знака значения. Аналогично, если значение не представимо из-за близости к нулю, strtod возвращает нуль. Она также устанавливает errno как ERANGE, если имелось переполнение или обнуление.
    double atof (const char *string)  (функция)