Aracılığıyla paylaş


_controlfp_s

Kayan nokta denetim sözcüğünü alır ve ayarlar. , öğesinin __control87_2_controlfp_control87bu 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 newControlayarlayan 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 currentControldepolar.

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), maskiç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_skullanabilirsiniz_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( &current_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_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 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, _controlfpve _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(&current_word, _DN_SAVE, _MCW_DN);
// Denormal values preserved on ARM platforms and on x64 processors with
// SSE2 support. NOP on x86 platforms.
_controlfp_s(&current_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_2nedeniyle); iki denetim sözcüğü arasında tutarsızlık varsa bayrağını _controlfp_s içinde currentControlayarlarEM_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 EINVALayarlanı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