_control87
, _controlfp
, __control87_2
Kayan nokta denetim sözcüğünü alır ve ayarlar. daha güvenli bir _controlfp
sürümü kullanılabilir; bkz _controlfp_s
. .
Sözdizimi
unsigned int _control87(
unsigned int new,
unsigned int mask
);
unsigned int _controlfp(
unsigned int new,
unsigned int mask
);
int __control87_2(
unsigned int new,
unsigned int mask,
unsigned int* x86_cw,
unsigned int* sse2_cw
);
Parametreler
new
Yeni denetim sözcüğü bit değerleri.
mask
Ayarlanacağı yeni denetim sözcüğü bitleri için maske.
x86_cw
x87 kayan nokta biriminin denetim sözcüğüyle doldurulur. Yalnızca SSE2 denetim sözcüğünü ayarlamak için 0 (NULL
) değerini geçirin.
sse2_cw
SSE kayan nokta birimi için denetim sözcüğü. Yalnızca x87 denetim sözcüğünü ayarlamak için 0 (NULL
) değerini geçirin.
Dönüş değeri
ve _controlfp
için_control87
, döndürülen değerdeki bitler kayan nokta denetim durumunu gösterir. tarafından _control87
döndürülen bitlerin tam tanımı için bkz FLOAT.H
. .
için __control87_2
, dönüş değeri 1'dir ve bu da başarıyı gösterir.
Açıklamalar
_control87
işlevi kayan nokta denetim sözcüğünü alır ve ayarlar. Kayan nokta denetim sözcüğü, programın platforma bağlı olarak 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 _control87
. değeri mask
0'a eşitse kayan _control87
nokta denetim sözcüğünü alır. Sıfır olmayan bir değerse mask
, denetim sözcüğü için yeni bir değer ayarlanır: içinde açık (yani 1'e eşit) mask
herhangi bir bit için, içindeki ilgili bit new
, denetim sözcüğünü güncelleştirmek için kullanılır. Başka bir deyişle, fpcntrl = ((fpcntrl & ~mask) | (new & mask))
kayan nokta denetim sözcüğü nerededir fpcntrl
.
Not
Varsayılan olarak, çalışma zamanı kitaplıkları tüm kayan nokta özel durumlarını maskeler.
_controlfp
, işlevle neredeyse aynı _control87
olan platformdan bağımsız, taşınabilir bir sürümüdür_control87
. Kodunuz birden fazla platformu hedeflediyse veya _controlfp_s
kullanın_controlfp
. ile _controlfp
arasındaki _control87
fark, değerleri nasıl ele DENORMAL
aldıklarıdır. x86, x64, ARM ve ARM64 platformları için _control87
özel durum maskesini DENORMAL OPERAND
ayarlayabilir ve temizleyebilirsiniz. _controlfp
özel durum maskesini DENORMAL OPERAND
değiştirmez. Bu örnekte fark gösterilmektedir:
_control87( _EM_INVALID, _MCW_EM );
// DENORMAL is unmasked by this call
_controlfp( _EM_INVALID, _MCW_EM );
// DENORMAL exception mask remains unchanged
Maske sabiti (mask
) ve yeni denetim değerleri (new
) için olası değerler, Denetim sözcüğü maskeleri ve değerleri tablosunda gösterilir. 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 ve ARM64 platformları 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
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.
_controlfp(_DN_SAVE, _MCW_DN);
// Denormal values preserved on ARM platforms and on x64 processors with
// SSE2 support. NOP on x86 platforms.
_controlfp(_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 ve ARM64 platformlarında _control87
ve _controlfp
işlevleri FPSCR yazmaç için geçerlidir. X64 platformlarında yalnızca MXCSR yazmacında depolanan SSE2 denetim sözcüğü etkilenir. x86 platformlarında _control87
ve _controlfp
varsa hem x87 hem de SSE2 için denetim sözcüklerini etkiler.
işlevi __control87_2
hem x87 hem de SSE2 kayan nokta birimlerinin birlikte veya ayrı olarak denetlenip denetlenemeye olanak tanır. Her iki birimi de etkilemek için ve sse2_cw
için iki tamsayının x86_cw
adreslerini geçirin. Yalnızca bir birimi etkilemek istiyorsanız, bu parametre için bir adres geçirin, ancak diğeri için 0 (NULL
) girin. Bu parametrelerden biri için 0 geçirilirse, işlevin bu kayan nokta birimi üzerinde hiçbir etkisi olmaz. Kodunuzun bir bölümü x87 kayan nokta birimini, başka bir bölümü de SSE2 kayan nokta birimini kullandığında kullanışlıdır.
Kayan nokta denetim sözcükleri _control87
için farklı değerler ayarlamak için kullanırsanız __control87_2
veya _controlfp
her iki kayan nokta biriminin durumunu göstermek için tek bir denetim sözcüğü döndüremeyebilirsiniz. Böyle bir durumda, bu işlevler iki denetim sözcüğü arasındaki tutarsızlığı göstermek için döndürülen tamsayı değerinde bayrağını ayarlar EM_AMBIGUOUS
. Bayrak EM_AMBIGUOUS
, döndürülen denetim sözcüğünün her iki kayan nokta denetim sözcüğünün durumunu doğru temsil etmeyebileceğine ilişkin bir uyarıdır.
ARM, ARM64 ve x64 platformlarında sonsuzluk modunu veya kayan nokta duyarlığı değiştirilmez. Duyarlık denetim maskesi x64 platformunda kullanılıyorsa, işlev bir onay oluşturur ve parametre doğrulamasında açıklandığı gibi geçersiz parametre işleyicisi çağrılır.
Not
__control87_2
ARM, ARM64 veya x64 platformlarında desteklenmez. ARM, ARM64 veya x64 platformları için programınızı kullanır __control87_2
ve derlerseniz, derleyici bir hata oluşturur.
Derlemek için (Ortak Dil Çalışma Zamanı Derlemesi) kullandığınızda /clr
bu işlevler yoksayılır. Ortak dil çalışma zamanı (CLR) yalnızca varsayılan kayan nokta duyarlık destekler.
Sözcük maskelerini ve değerlerini denetleme
Maske için _MCW_EM
, maskenin temizlenmesi özel durumu ayarlar ve bu da donanım özel durumunu sağlar; maskenin ayarlanması ö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
sonrasında _EM_UNDERFLOW
hemen bir donanım özel durumu oluşturmak için MASM yönergesini çağırınFWAIT
.
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 |
---|---|
_control87 , _controlfp , _control87_2 |
<float.h> |
Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.
Örnek
// crt_cntrl87.c
// processor: x86
// compile by using: cl /W4 /arch:IA32 crt_cntrl87.c
// This program uses __control87_2 to output the x87 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_x87 = 0;
int result;
// Show original x87 control word and do calculation.
result = __control87_2(0, 0, &control_word_x87, 0 );
printf( "Original: 0x%.8x\n", control_word_x87 );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
// Set precision to 24 bits and recalculate.
result = __control87_2(_PC_24, MCW_PC, &control_word_x87, 0 );
printf( "24-bit: 0x%.8x\n", control_word_x87 );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
// Restore default precision-control bits and recalculate.
result = __control87_2( _CW_DEFAULT, MCW_PC, &control_word_x87, 0 );
printf( "Default: 0x%.8x\n", control_word_x87 );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
}
Original: 0x0009001f
0.1 * 0.1 = 1.000000000000000e-02
24-bit: 0x000a001f
0.1 * 0.1 = 9.999999776482582e-03
Default: 0x0009001f
0.1 * 0.1 = 1.000000000000000e-02
Ayrıca bkz.
Matematik ve kayan nokta desteği
_clear87
, _clearfp
_status87
, _statusfp
, _statusfp2
_controlfp_s