.\" -*- coding: UTF-8 -*- .\" Copyright (c) 2008, Linux Foundation, written by Michael Kerrisk .\" .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH math_error 7 "3 мая 2023 г." "Linux man\-pages 6.05.01" .SH ИМЯ math_error \- определение ошибок при выполнении математических функций .SH СИНТАКСИС .nf \fB#include \fP \fB#include \fP \fB#include \fP .fi .SH ОПИСАНИЕ При возникновении ошибки большинство библиотечных функций возвращают специальное значение (например, \-1 или NULL). Так как математические функции, объявленные в \fI\fP, обычно, возвращают число с плавающей запятой, то для выдачи ошибки используются другие способы. Есть два варианта вернуть сообщение об ошибке: старый — изменяя \fIerrno\fP; новый — используя механизм исключений плавающей запятой (с помощью \fBfeclearexcept\fP(3) и \fBfetestexcept\fP(3) как описано ниже), описанный в \fBfenv\fP(3). .PP Переносимая программа, которой требуется проверка на ошибки в математических функциях, должна обнулить \fIerrno\fP и выполнить вызов .PP .in +4n .EX feclearexcept(FE_ALL_EXCEPT); .EE .in .PP перед тем, как вызвать математическую функцию. .PP По возврату из математической функции, если переменная \fIerrno\fP ненулевая, а так же следующий вызов (смотрите \fBfenv\fP(3)) вернул ненулевое значение .PP .in +4n .EX fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW); .EE .in .PP .\" enum .\" { .\" FE_INVALID = 0x01, .\" __FE_DENORM = 0x02, .\" FE_DIVBYZERO = 0x04, .\" FE_OVERFLOW = 0x08, .\" FE_UNDERFLOW = 0x10, .\" FE_INEXACT = 0x20 .\" }; то ошибка произошла в математической функции. .PP Условия возникновения математических ошибок приведены ниже. .SS "Ошибка области" \fIОшибка области\fP возникает, когда математической функции передаётся аргумент, чьё значение выходит за границы области, ожидаемой функцией (например, передача отрицательного значения в функцию \fBlog\fP(3)). Когда возникает ошибка области, чаще всего, математические функции возвращают NaN (хотя некоторые функции в этом случае возвращают другое значение); \fIerrno\fP присваивается \fBEDOM\fP возникает исключение плавающей запятой «invalid» (\fBFE_INVALID\fP). .SS "Ошибка особой точки" \fIОшибка особой точки\fP возникает, когда результат математической функции должен быть равен бесконечности (например, логарифм 0 равен отрицательной бесконечности). Когда возникает ошибка особой точки функция возвращает значение (со знаком) \fBHUGE_VAL\fP, \fBHUGE_VALF\fP или \fBHUGE_VALL\fP, в зависимости от типа результата функции — \fIdouble\fP, \fIfloat\fP или \fIlong double\fP. Знак результата будет математически корректным для функции. Переменной \fIerrno\fP присваивается значение \fBERANGE\fP и возникает исключение плавающей запятой «divide\-by\-zero» (\fBFE_DIVBYZERO\fP). .SS "Ошибка диапазона" \fIОшибка диапазона\fP возникает, когда величина результата функции не может быть представлена типом результата функции. Возвращаемое значение функции зависит от того, было ли при ошибке диапазона переполнение или исчерпание. .PP Результат с плавающей запятой \fIпереполнен\fP, если он является конечным значением, но слишком большим для представления типом результата. При возникновении переполнения функция возвращает значение \fBHUGE_VAL\fP, \fBHUGE_VALF\fP или \fBHUGE_VALL\fP, в зависимости от того, каков тип результата функции — \fIdouble\fP, \fIfloat\fP или \fIlong double\fP. Переменной \fIerrno\fP присваивается значение \fBERANGE\fP и возникает переполнение плавающей запятой «overflow» (\fBFE_OVERFLOW\fP). .PP A floating result \fIunderflows\fP if the result is too small to be represented in the result type. If an underflow occurs, a mathematical function typically returns 0.0 (C99 says a function shall return "an implementation\-defined value whose magnitude is no greater than the smallest normalized positive number in the specified type"). \fIerrno\fP may be set to \fBERANGE\fP, and an "underflow" (\fBFE_UNDERFLOW\fP) floating\-point exception may be raised. .PP Некоторые функции возвращают ошибку диапазона, ели значение аргумента или правильный результат функции был бы \fIсубнормальным\fP. Субнормальное значение — ненулевое значение, но его величина так мала, что не может быть представлена в нормализованном виде (т. е., есть 1 с самом значимом бите значащей части). Представление субнормального числа будет содержать один или более начальных нулей в значащей части. .SH ЗАМЕЧАНИЯ .\" See CONFORMANCE in the glibc 2.8 (and earlier) source. The \fImath_errhandling\fP identifier specified by C99 and POSIX.1 is not supported by glibc. This identifier is supposed to indicate which of the two error\-notification mechanisms (\fIerrno\fP, exceptions retrievable via \fBfetestexcept\fP(3)) is in use. The standards require that at least one be in use, but permit both to be available. The current (glibc 2.8) situation under glibc is messy. Most (but not all) functions raise exceptions on errors. Some also set \fIerrno\fP. A few functions set \fIerrno\fP, but don't raise an exception. A very few functions do neither. See the individual manual pages for details. .PP .\" http://www.securecoding.cert.org/confluence/display/seccode/FLP32-C.+Prevent+or+detect+domain+and+range+errors+in+math+functions Чтобы при проверке ошибок избежать сложностей с использованием \fIerrno\fP и \fBfetestexcept\fP(3) часто советуют перед вызовом проверять аргументы на некорректные значения. Например, следующий код проверяет, что аргумент \fBlog\fP(3) не равен NaN и не равен нулю (ошибка особой точки) или меньше нуля (ошибка области): .PP .in +4n .EX double x, r; \& if (isnan(x) || islessequal(x, 0)) { /* Deal with NaN / pole error / domain error */ } \& r = log(x); .EE .in .PP Данная страница не применима к комплексным математическим функциям (описанным в \fI\fP), для которых в C99 and POSIX.1, обычно, не требуется возвращать ошибки. .PP Параметр \fBgcc\fP(1) \fI\-fno\-math\-errno\fP заставляет в исполняемых файлах вызывать реализации некоторых математических функций, которые быстрее стандартных, но не изменяющие \fIerrno\fP при ошибке (параметр \fBgcc\fP(1) \fI\-ffast\-math\fP также включает \fI\-fno\-math\-errno\fP.) Возникновение ошибки по\-прежнему можно проверить с помощью \fBfetestexcept\fP(3). .SH "СМ. ТАКЖЕ" \fBgcc\fP(1), \fBerrno\fP(3), \fBfenv\fP(3), \fBfpclassify\fP(3), \fBINFINITY\fP(3), \fBisgreater\fP(3), \fBmatherr\fP(3), \fBnan\fP(3) .PP \fIinfo libc\fP .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан aereiae , Alexey , Azamat Hackimov , Dmitriy S. Seregin , Dmitry Bolkhovskikh , ITriskTI , Max Is , Yuri Kozlov , Иван Павлов и Малянов Евгений Викторович . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .