Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_1_APR.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
582.14 Кб
Скачать

2.30 Matherr - изменяемый обработчик математических ошибок

#include <math.h>

int matherr(struct exception *e);

matherr вызывается всегда, когда функция из математической библиотеки генерирует ошибку. Вы можете видоизменить matherr своей собственной подпрограммой для того, чтобы выбрать необходимое обращение с ошибками. Выбранный matherr должен выдавать 0, если ему не удается распознать ошибку, и число, отличное от нуля в противном случае.

  • Когда matherr принимает ненулевое значение, сообщение об ошибке не выводится, и значение errno не изменяется. Вы можете подстроить под себя одно или оба этих обстоятельства в своей версии matherr, используя ту информацию, что содержится в структуре *e.

  • Ниже представлена структура exception (определенная в 'math.h'):

struct exception {

int type;

char *name;

double arj1, arj2, retval;

int err;

};

Поля структуры exception имеют следующие значения:

typeТип произошедшей ошибки. Множество закодированных типов ошибок также находится в 'math.h'.

nameУказатель на строку, заканчивающуюся нулем, содержащую имя той функции из математической библиотеки, в которой произошла ошибка.

arj1, arj2Аргументы, вызвавшие ошибку.

retvalВозвращаемое значение ошибки (то значение, которое будет иметь вызываемая функция).

errЕсли не ноль, то это новое значение, присвоенное errno.

Типы ошибок, определенные в 'math.h' представлают собой возможные математические ошибки типа:

DOMAINАргумент не в области определения функции; например log(-1.0).

SINGПредполагаемые вычисления привели бы к появлению особой точки, например pow(0.0, -2.0).

OVERFLOWВычисления привели бы к результату слишком большому для представления, например exp(1000.0).

UNDERFLOWВычисления привели бы к результату слишком маленькому для представления, например exp(-1000.0).

TLOSSПолная потеря разрядности. Результат не имел бы значащих цифр, например sin(10e70).

PLOSSЧастичная потеря разрядности.

Библиотечное определение matherr возвращает 0 во всех случаях.

  • Вы можете изменить результат вызываемой функции совершив в matherr изменение e->retval; этот результат передается к источнику вызова.

  • Если функций matherr возвращает 0 (что означает неспособность разрешить ошибку), источник вызова присваивает errno необходимоеое значение и выводит сообщение об ошибке.

  • matherr - не ANSI-функция.

2.31 Modf, modff - разбиение на дробную и целую части

#include <math.h>

double modf(double val, double *ipart);

float modff(float val, float *ipart);

modf разделяет переменную val типа double на целую и дробную части, возвращая дробную часть и сохраняя целую в *ipart. Не происходит никакого округления, сумма дробной и целой частей гарантированно составит val. То есть, если realpart = mod(val, &intpart); тогда 'realpart + intpart' в точности будет равняться val.

  • modff идентичен с точностью до типов.

  • Возвращается дробная часть. Знак результата совпадает со знаком исходного аргумента val.

  • modf удовлетворяет стандарту ANSI C. modff является расширением.

2.32 Nan, nanf - представление бесконечности

#include <math.h>

double nan(void);

float nanf(void);

nan и nanf возвращают NaN, определенный в IEEE, двойной и одинарной точности соответственно.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]