.\" -*- coding: UTF-8 -*- .\" Copyright (c) 2008, Linux Foundation, written by Michael Kerrisk .\" .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH MATH_ERROR 7 "15 сентября 2017 г." Linux "Руководство программиста Linux" .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 (version 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)) { /* обработка NaN / ошибки особой точки / ошибки области */ } 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 .SH ЗАМЕЧАНИЯ Эта страница является частью проекта Linux \fIman\-pages\fP версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу \%https://www.kernel.org/doc/man\-pages/. .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 .