Aracılığıyla paylaş


_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 _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 .

Dekont

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.

Dekont

__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