Поделиться через


_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 биты в возвращенном значении указывают состояние устройства. Обратитесь к файлу FLOAT.H за определениями битов, возвращаемых _statusfp. Многие математические библиотечные функции изменяют слово состояния устройства с непредсказуемыми результатами. Оптимизация может изменить, объединить и исключить операции с плавающей запятой вокруг вызовов _status87, _statusfp и связанных функций. Используйте параметр компилятора /Od (Выключение (отладчика)) или директиву pragma fenv_access для предотвращения оптимизаций, переупорядочивающих операции с плавающей запятой. Возвращаемые из _clearfp и _statusfp значения, а также возвращаемые параметры _statusfp2 более надежны при меньшем числе операций с плавающей запятой, выполняющихся между известными значениями слова состояния устройства.

Заметки

Функция _statusfp получает слово состояния устройства, работающего со значениями с плавающей запятой. Слово состояния — это сочетание состояния процессора значений с плавающей запятой и других условий, обнаруженных обработчиком исключений операций с плавающей запятой исключением, — например, переполнение стека или потеря точности. Демаскированные исключения проверяются перед возвращением слова состояния. Это означает, что вызывающая функция информируется о необработанных исключениях. На платформах x86 _statusfp возвращает комбинацию состояний x87 и SSE2. На платформах x64 возвращаемое состояние основывается на состоянии MXCSR SSE. На платформах ARM _statusfp возвращает состояние из регистра FPSCR.

_statusfp - независимая от платформы, переносимая версия _status87. Она идентична _status87 на платформах Intel (x86) и также поддерживается платформами ARM и x64. Чтобы убедиться, что код, выполняющий операции с плавающей запятой, переносим на все архитектуры, используйте _statusfp. Если используются только платформы x86, то можно использовать или _status87, или _statusfp.

Рекомендуется использовать _statusfp2 для микросхем (например Pentium IV), обладающих и x87, и SSE2. Для _statusfp2, адреса заполняются с использованием состояния как для x87, так и для SSE2. Для микросхемы, поддерживающей x87 и SSE2 процессоры с плавающей запятой, EM_AMBIGUOUS имеет значение 1, если _statusfp или _controlfp используются и действие было неоднозначным, поскольку оно могло ссылаться на состояние x87 или SSE2. Функция _statusfp2 поддерживается только на платформах x86.

Эти функции не используются для компиляции /clr (компиляция CLR) или /clr:pure, поскольку среда 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();
}
  

Эквивалент в .NET Framework

Неприменимо. Для вызова стандартной функции C используйте PInvoke. Для получения дополнительной информации см. Примеры вызовов неуправляемого кода.

См. также

Ссылки

Поддержка чисел с плавающей запятой

_clear87, _clearfp

_control87, _controlfp, __control87_2