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.
, öğesinin_control87_controlfp__control87_2 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 _control87 adrese kayan nokta denetim sözcüğünü alan ve kullanarak currentControlayarlayan platformdan bağımsız ve daha güvenli bir sürümüdürnewControl. 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 _control87kullanabilirsiniz_controlfp_s.
ile _control87 arasındaki _controlfp_s 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_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(¤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.
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.
x64'te, yalnızca MXCSR yazmacında depolanan SSE2 denetim sözcüğü etkilenir. Sonsuz modu veya kayan nokta duyarlık değiştirme desteklenmez. 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.
x86'da, _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 EM_AMBIGUOUSayarlarcurrentControl. 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.
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 errnoayarlanırEINVAL.
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.
Arm platformları
- Sonsuz modu 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.
- ARM32'de (kullanımdan kaldırıldı), Windows FP özel durumlarını desteklemez.
- ARM64'te, FPCR kaydının tamamını
_MCW_EMveya herhangi bir bitini (_EM_INEXACT,_EM_UNDERFLOW,_EM_OVERFLOW,_EM_ZERODIVIDEve_EM_INVALID) maskesini doğru bir şekilde kaldırın. geçersiz işlemstd::acosgibi standart matematik işlevleri tarafından tetiklenen kayan nokta özel durumları bu davranıştan muaftır ve FPCR kaydına bağlı olarak yoksayılabilir veya düzgün şekilde yükseltilebilir. Daha fazla bilgi için bkz. ARM32 ABI Kurallarına Genel Bakış. - ARM64EC'da Windows, işlemci kayan nokta özel durumlarını yakalar ve bunları FPCR kaydında devre dışı bırakır. Bu, farklı işlemci varyantları arasında tutarlı davranış sağlar.
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_UNDERFLOW'den hemen sonra _EM_OVERFLOW 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