Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Pobiera słowo stanu zmiennoprzecinkowe.
Składnia
unsigned int _status87( void );
unsigned int _statusfp( void );
void _statusfp2(unsigned int *px86, unsigned int *pSSE2)
Parametry
px86
Ten adres jest wypełniony słowem stanu jednostki zmiennoprzecinkowej x87.
pSSE2
Ten adres jest wypełniony słowem stanu jednostki zmiennoprzecinkowej SSE2.
Wartość zwracana
Dla _status87
i _statusfp
bity w zwróconej wartości wskazują stan zmiennoprzecinkowy. Zobacz FLOAT. Plik dołączania H dla definicji bitów, które są zwracane przez _statusfp
. Wiele funkcji biblioteki matematycznej modyfikuje wyraz stanu zmiennoprzecinkowego z nieprzewidywalnymi wynikami. Optymalizacja może zmienić kolejność, połączyć i wyeliminować operacje zmiennoprzecinkowe wokół wywołań funkcji _status87
, _statusfp
i powiązanych. Użyj opcji kompilatora /Od (Wyłącz (Debug)) lub fenv_access
dyrektywy pragma, aby zapobiec optymalizacjom, które zmieniają kolejność operacji zmiennoprzecinkowych. Zwracane wartości z _clearfp
i i _statusfp
, a także parametry zwracane parametrów _statusfp2
, są bardziej niezawodne, jeśli mniej operacji zmiennoprzecinkowych jest wykonywanych między znanymi stanami słowa stanu zmiennoprzecinkowego.
Uwagi
Funkcja _statusfp
pobiera słowo stanu zmiennoprzecinkowego. Wyraz stanu jest kombinacją stanu procesora zmiennoprzecinkowego i innych warunków wykrytych przez program obsługi wyjątków zmiennoprzecinkowych — na przykład przepełnienie stosu zmiennoprzecinkowego i niedopełnienie. Niemaskowane wyjątki są sprawdzane przed zwróceniem zawartości wyrazu stanu. Innymi słowy, obiekt wywołujący jest informowany o oczekujących wyjątkach. Na platformach _statusfp
x86 zwraca kombinację stanu zmiennoprzecinkowego x87 i SSE2. Na platformach x64 zwrócony stan jest oparty na stanie MXCSR usługi SSE. Na platformach _statusfp
ARM64 zwraca stan z rejestru FPSCR.
_statusfp
jest niezależną od platformy, przenośną wersją programu _status87
. Jest ona identyczna z _status87
platformami Intel (x86) i jest również obsługiwana przez platformy x64 i ARM64. Aby upewnić się, że kod zmiennoprzecinkowa jest przenośny do wszystkich architektur, użyj polecenia _statusfp
. Jeśli używasz tylko platform x86, możesz użyć _status87
polecenia lub _statusfp
.
Zalecamy _statusfp2
stosowanie układów (takich jak Pentium IV), które mają procesor x87 i SSE2 zmiennoprzecinkowy. W przypadku _statusfp2
elementu adresy są wypełniane przy użyciu słowa stanu zmiennoprzecinkowego dla procesora zmiennoprzecinkowego x87 lub SSE2. W przypadku mikroukładu obsługującego procesory zmiennoprzecinkowe x87 i SSE2 jest ustawiona na 1, jeśli _statusfp
jest używana, _controlfp
a akcja była niejednoznaczna, EM_AMBIGUOUS
ponieważ może odwoływać się do słowa o stanie x87 lub SSE2. Funkcja jest obsługiwana _statusfp2
tylko na platformach x86.
Te funkcje nie są przydatne w przypadku /clr (kompilacja środowiska uruchomieniowego języka wspólnego), ponieważ środowisko uruchomieniowe języka wspólnego (CLR) obsługuje tylko domyślną precyzję zmiennoprzecinkową.
Wymagania
Procedura | Wymagany nagłówek |
---|---|
_status87 , , _statusfp _statusfp2 |
<float.h> |
Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
Przykład
// 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
Zobacz też
Obsługa obliczeń matematycznych i zmiennoprzecinkowych
_clear87
, _clearfp
_control87
, , _controlfp
__control87_2