_controlfp_s
Kayan nokta denetim sözcüğünü alır ve ayarlar. , öğesinin __control87_2
_controlfp
_control87
bu sürümünde, CRT'deki Güvenlik özellikleri bölümünde açıklandığı gibi güvenlik geliştirmeleri vardır.
Sözdizimi
errno_t _controlfp_s(
unsigned int *currentControl,
unsigned int newControl,
unsigned int mask
);
Parametreler
currentControl
Geçerli control-word bit değeri.
newControl
Yeni denetim sözcüğü bit değerleri.
mask
Ayarlanacağı yeni denetim sözcüğü bitleri için maske.
Dönüş değeri
Başarılı olursa sıfır veya değer errno
hata kodu.
Açıklamalar
_controlfp_s
işlevi, içinde depolanan currentControl
adrese kayan nokta denetim sözcüğünü alan ve kullanarak newControl
ayarlayan platformdan bağımsız ve daha güvenli bir sürümüdür_control87
. Değerlerdeki bitler kayan nokta denetim durumunu gösterir. Kayan nokta denetim durumu, programın platforma bağlı olarak kayan nokta matematik paketindeki duyarlık, yuvarlama ve sonsuzluk modlarını değiştirmesini sağlar. Kayan nokta özel durumlarını maskelemek veya maskesini silmek için de kullanabilirsiniz _controlfp_s
.
değeri mask
0'a eşitse kayan _controlfp_s
nokta denetim sözcüğünü alır ve alınan değeri içinde currentControl
depolar.
mask
Sıfır değilse, denetim sözcüğü için yeni bir değer ayarlanır: içinde ayarlanan herhangi bir bit için (yani, 1'e eşit), mask
içindeki ilgili bitnew
, denetim sözcüğünü güncelleştirmek için kullanılır. Başka bir deyişle, fpcntrl = ((fpcntrl & ~mask) | (newControl & mask))
kayan nokta denetim sözcüğü nerededir fpcntrl
. Bu senaryoda, currentControl
değişiklik tamamlandıktan sonra değere ayarlanır; eski control-word bit değeri değildir.
Not
Varsayılan olarak, çalışma zamanı kitaplıkları tüm kayan nokta özel durumlarını maskeler.
_controlfp_s
Intel (x86), x64 ve ARM platformlarında işleviyle neredeyse aynıdır _control87
. x86, x64 veya ARM platformlarını hedeflediyseniz veya _controlfp_s
kullanabilirsiniz_control87
.
ile _controlfp_s
arasındaki _control87
fark, normal dışı değerleri nasıl ele aldıklarıdır. Intel (x86), x64 ve ARM platformları için _control87
özel durum maskesini DENORMAL OPERAND
ayarlayabilir ve temizleyebilir. _controlfp_s
özel durum maskesini DENORMAL OPERAND
değiştirmez. Bu örnekte fark gösterilmektedir:
_control87( _EM_INVALID, _MCW_EM );
// DENORMAL is unmasked by this call.
unsigned int current_word = 0;
_controlfp_s( ¤t_word, _EM_INVALID, _MCW_EM );
// DENORMAL exception mask remains unchanged.
Maske sabiti (mask
) ve yeni denetim değerleri (newControl
) için olası değerler aşağıdaki Onaltılık Değerler tablosunda gösterilmiştir. Onaltılık değerleri açıkça sağlamak yerine, aşağıda listelenen taşınabilir sabitleri (_MCW_EM
, _EM_INVALID
vb.) bu işlevlerin bağımsız değişkenleri olarak kullanın.
Intel (x86) türetilmiş platformlar, donanımdaki DENORMAL
giriş ve çıkış değerlerini destekler. x86 davranışı değerleri korumaktır DENORMAL
. ARM platformu ve SSE2 desteğine sahip x64 platformları, işlenenlerin ve sonuçların boşaltılması veya sıfıra zorlanması için olanak tanır DENORMAL
. _controlfp_s
, _controlfp
ve _control87
işlevleri bu davranışı değiştirmek için bir maske sağlar. Aşağıdaki örnekte bu maskenin kullanımı gösterilmektedir:
unsigned int current_word = 0;
_controlfp_s(¤t_word, _DN_SAVE, _MCW_DN);
// Denormal values preserved on ARM platforms and on x64 processors with
// SSE2 support. NOP on x86 platforms.
_controlfp_s(¤t_word, _DN_FLUSH, _MCW_DN);
// Denormal values flushed to zero by hardware on ARM platforms
// and x64 processors with SSE2 support. Ignored on other x86 platforms.
ARM platformlarında işlev FPSCR _controlfp_s
yazmaç için geçerlidir. x64 mimarilerinde, yalnızca MXCSR yazmacında depolanan SSE2 denetim sözcüğü etkilenir. Intel (x86) platformlarında, _controlfp_s
varsa hem x87 hem de SSE2 için denetim sözcüklerini etkiler. İki denetim sözcüğü birbiriyle tutarsız olabilir (örneğin, önceki bir çağrısı __control87_2
nedeniyle); iki denetim sözcüğü arasında tutarsızlık varsa bayrağını _controlfp_s
içinde currentControl
ayarlarEM_AMBIGUOUS
. Bu, döndürülen denetim sözcüğünün her iki kayan nokta denetim sözcüğünün de durumunu doğru temsil etmeyebileceğine ilişkin bir uyarıdır.
ARM ve x64 mimarilerinde sonsuzluk modunu veya kayan nokta duyarlık değiştirme desteklenmez. Duyarlık denetim maskesi x64 platformunda kullanılıyorsa, işlev parametre doğrulamasında açıklandığı gibi bir onay oluşturur ve geçersiz parametre işleyicisi çağrılır.
Maske doğru ayarlanmadıysa, bu işlev Parametre doğrulama bölümünde açıklandığı gibi geçersiz bir parametre özel durumu oluşturur. Yürütmenin devam etmesi için izin verilirse, bu işlev döndürür EINVAL
ve olarak EINVAL
ayarlanırerrno
.
Ortak dil çalışma zamanı (CLR) yalnızca varsayılan kayan nokta duyarlığı desteklediğinden derlemek için (Ortak Dil Çalışma Zamanı Derlemesi) kullandığınızda /clr
bu işlev yoksayılır.
Varsayılan olarak, bu işlevin genel durumunun kapsamı uygulama olarak belirlenmiştir. Bu davranışı değiştirmek için bkz. CRT'de Genel durum.
Sabitleri ve değerleri maskele
Maskenin _MCW_EM
temizlenmesi, donanım özel durumunun ayarlanmasına izin veren özel durumu ayarlar; ayarı özel durumu gizler. veya _EM_UNDERFLOW
_EM_OVERFLOW
oluşursa, sonraki kayan nokta yönergesi yürütülene kadar donanım özel durumu oluşmaz. veya _EM_OVERFLOW
'den hemen sonra _EM_UNDERFLOW
bir donanım özel durumu oluşturmak için yönergesini çağırınFWAIT MASM
.
Maske | Onaltılık değer | Sabit | Onaltılık değer |
---|---|---|---|
_MCW_DN (Normal dışı denetim) |
0x03000000 | _DN_SAVE _DN_FLUSH |
0x00000000 0x01000000 |
_MCW_EM (Kesme özel durum maskesi) |
0x0008001F | _EM_INVALID _EM_DENORMAL _EM_ZERODIVIDE _EM_OVERFLOW _EM_UNDERFLOW _EM_INEXACT |
0x00000010 0x00080000 0x00000008 0x00000004 0x00000002 0x00000001 |
_MCW_IC (Sonsuzluk denetimi)(ARM veya x64 platformlarında desteklenmez.) |
0x00040000 | _IC_AFFINE _IC_PROJECTIVE |
0x00040000 0x00000000 |
_MCW_RC (Yuvarlama denetimi) |
0x00000300 | _RC_CHOP _RC_UP _RC_DOWN _RC_NEAR |
0x00000300 0x00000200 0x00000100 0x00000000 |
_MCW_PC (Duyarlık denetimi)(ARM veya x64 platformlarında desteklenmez.) |
0x00030000 | _PC_24 (24 bit)_PC_53 (53 bit)_PC_64 (64 bit) |
0x00020000 0x00010000 0x00000000 |
Gereksinimler
Yordam | Gerekli başlık |
---|---|
_controlfp_s |
<float.h> |
Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.
Örnek
// crt_contrlfp_s.c
// processor: x86
// This program uses _controlfp_s to output the FP control
// word, set the precision to 24 bits, and reset the status to
// the default.
#include <stdio.h>
#include <float.h>
#pragma fenv_access (on)
int main( void )
{
double a = 0.1;
unsigned int control_word;
int err;
// Show original FP control word and do calculation.
err = _controlfp_s(&control_word, 0, 0);
if ( err ) /* handle error here */;
printf( "Original: 0x%.4x\n", control_word );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
// Set precision to 24 bits and recalculate.
err = _controlfp_s(&control_word, _PC_24, MCW_PC);
if ( err ) /* handle error here */;
printf( "24-bit: 0x%.4x\n", control_word );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
// Restore default precision-control bits and recalculate.
err = _controlfp_s(&control_word, _CW_DEFAULT, MCW_PC);
if ( err ) /* handle error here */;
printf( "Default: 0x%.4x\n", control_word );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
}
Original: 0x9001f
0.1 * 0.1 = 1.000000000000000e-002
24-bit: 0xa001f
0.1 * 0.1 = 9.999999776482582e-003
Default: 0x9001f
0.1 * 0.1 = 1.000000000000000e-002
Ayrıca bkz.
Matematik ve kayan nokta desteği
_clear87
, _clearfp
_status87
, _statusfp
, _statusfp2
_control87
, _controlfp
, __control87_2