Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 _controlfpiçin_control87, döndürülen değerdeki bitler kayan nokta denetim durumunu gösterir. tarafından _control87dö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) maskherhangi 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_skullanı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_INVALIDvb.) 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_cwiç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_OVERFLOWsonrası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