_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