_status87
, , _statusfp
_statusfp2
Получает слово состояния модуля операций с плавающей запятой.
Синтаксис
unsigned int _status87( void );
unsigned int _statusfp( void );
void _statusfp2(unsigned int *px86, unsigned int *pSSE2)
Параметры
px86
Этот адрес заполняется словом состояния для модуля операций с плавающей запятой x87.
pSSE2
Этот адрес заполняется словом состояния для модуля операций с плавающей запятой SSE2.
Возвращаемое значение
Для функций _status87
и _statusfp
биты в возвращаемом значении указывают состояние модуля операций с плавающей запятой. Определения битов, возвращаемых функцией _statusfp
, см. в файле FLOAT.H. Многие математические библиотечные функции изменяют слово состояния операций с плавающей запятой с непредсказуемыми результатами. Оптимизация может изменять, объединять и исключать операции с плавающей запятой вокруг вызовов _status87
, _statusfp
и связанных функций. Используйте параметр компилятора /Od (Disable (Debug)) или fenv_access
директиву pragma, чтобы предотвратить оптимизацию, которая переупорядочение операций с плавающей запятой. Чем меньше операций с плавающей запятой выполняется между известными значениями слова состояния модуля операций с плавающей запятой, тем надежнее возвращаемые из функций _clearfp
и _statusfp
значения, а также возвращаемые параметры функции _statusfp2
.
Замечания
Функция _statusfp
получает слово состояния модуля операций с плавающей запятой. Слово состояния содержит состояние модуля операций с плавающей запятой и другие условия, обнаруженные обработчиком исключений операций с плавающей запятой, — например, переполнение стека или потеря точности. Перед возвращением содержимого слова состояния проверяются немаскированные исключения. Другими словами, вызывающий объект сообщает о ожидающих исключениях. На платформах x86 функция _statusfp
возвращает комбинацию состояний x87 и SSE2 модуля операций с плавающей запятой. На платформах x64 возвращенное состояние основано на состоянии MXCSR SSE. На платформах _statusfp
ARM64 возвращает состояние из регистра FPSCR.
_statusfp
— независимая от платформы, переносимая версия функции _status87
. Он идентичен _status87
платформам Intel (x86), а также поддерживается платформами x64 и ARM64. Чтобы код, выполняющий операции с плавающей запятой, был переносимым на все архитектуры, используйте функцию _statusfp
. Если вы используете только платформы x86, можно использовать _status87
либо _statusfp
.
Для процессоров, поддерживающих как набор команд x87, так и SSE2 (например, Pentium IV), рекомендуется использовать функцию _statusfp2
. В случае функции _statusfp2
адреса заполняются с использованием слова состояния процессора операций с плавающей запятой как для x87, так и для SSE2. Для микросхемы, поддерживающей процессоры x87 и SSE2 с плавающей запятой, EM_AMBIGUOUS
установлено значение 1, если _statusfp
_controlfp
или используется, и действие было неоднозначным, так как оно может ссылаться на слово состояния x87 или SSE2 с плавающей запятой. Функция _statusfp2
поддерживается только на платформах x86.
Эти функции не полезны для /clr (компиляция clr), так как среда CLR (CLR) поддерживает только точность с плавающей запятой по умолчанию.
Требования
Маршрут | Обязательный заголовок |
---|---|
_status87 , , _statusfp _statusfp2 |
<float.h> |
Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример
// crt_statusfp.c
// Build by using: cl /W4 /Ox /nologo crt_statusfp.c
// This program creates various floating-point errors and
// then uses _statusfp to display messages that indicate these problems.
#include <stdio.h>
#include <float.h>
#pragma fenv_access(on)
double test( void )
{
double a = 1e-40;
float b;
double c;
printf("Status = 0x%.8x - clear\n", _statusfp());
// Assignment into b is inexact & underflows:
b = (float)(a + 1e-40);
printf("Status = 0x%.8x - inexact, underflow\n", _statusfp());
// c is denormal:
c = b / 2.0;
printf("Status = 0x%.8x - inexact, underflow, denormal\n",
_statusfp());
// Clear floating point status:
_clearfp();
return c;
}
int main(void)
{
return (int)test();
}
Status = 0x00000000 - clear
Status = 0x00000003 - inexact, underflow
Status = 0x00080003 - inexact, underflow, denormal
См. также
Поддержка математических и плавающих точек
_clear87
, _clearfp
_control87
, , _controlfp
__control87_2