_control87, _controlfp, __control87_2
Alır ve kayan nokta denetim word ayarlar. Daha güvenli bir sürümünü _controlfp kullanılabilir; see _controlfp_s.
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 word bit değerleri.mask
Ayarlamak yeni denetim word bit maskesi.x86_cw
Kayan nokta birimi x 87 denetim sözcüğü ile doldurulur. PASS 0 olarak (NULL) yalnızca SSE2 denetim word ayarlamak için.sse2_cw
Word sse kayan nokta birimi için kontrol eder. PASS 0 olarak (NULL) yalnızca x 87 denetim word ayarlamak için.
Dönüş Değeri
İçin _control87 ve _controlfp, bit değerini döndürdü kayan nokta denetim durumu gösterir. Tam bir tanımı tarafından döndürülen bit _control87, float bakın.H.
İçin __control87_2, dönüş değeri 1 ' dir başarı gösteren.
Notlar
_control87 İşlevi alır ve kayan nokta denetim word ayarlar. Kayan nokta denetim word program duyarlılık, yuvarlama ve kayan nokta matematiğini paketindeki sonsuz modları değiştirmek izin verir. Ayrıca maske veya maskeyi Kaldır kullanarak kayan nokta özel durumlar _control87. Varsa değeri mask 0'a eşit olan _control87 kayan nokta denetim word alır. mask İse sıfır olmayan, Denetim word için yeni bir değer ayarlanır: 1 (eşittir) üzerinde bulunan herhangi bir bit için mask, karşılık gelen bit new denetim Word'ü güncelleştirmek için kullanılır. In other words, fpcntrl= ((fpcntrl& ~mask) | (new & mask)) nerede fpcntrl kayan nokta denetim sözcüktür.
Not
Çalışma zamanı kitaplıkları varsayılan olarak tüm kayan nokta özel durumlar maskeleyebilir.
_controlfp platformdan bağımsız, taşınabilir bir sürümü olan _control87. Hemen hemen aynı _control87 Intel (x 86) platformlarında çalışır ve MIPS ve ALFA tarafından desteklenen platformlar. Kayan nokta kodunuzu MIPS ya da ALFA taşınabilir olmasını sağlamak için _controlfp. X 86 hedeflediğiniz, platformlar, kullanır _control87 veya _controlfp.
Arasındaki fark _control87 ve _controlfp bu iki işlev denormal değerleri kabul et yoludur. Intel (x 86) platformları için _control87 ayarlayabilir ve türü Mantis UYARLAMA İŞLENENİ özel durum maskesi temizleyin. alpha platformlarında bu istisna desteklemez ve _controlfp türü Mantis UYARLAMA İŞLENENİ özel durum maskesi değiştirmez. Aşağıdaki ö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 sabit için olası değerler (mask) ve yeni denetim değerleri (new) aşağıdaki onaltılık değerler tabloda gösterilmiştir. Aşağıda listelenen taşınabilir sabitleri kullanın (_MCW_EM, _EM_INVALID, vb.) Bu işlevler için bağımsız değişken olarak onaltılık sağlama yerine değerleri açıkça.
alpha platformlarında denormal giriş desteği ve yazılım değerlerini çıktı. Windows NT varsayılan davranışını Bu platformlarda flush denormal giriş ve çıkış değerleri sıfıra sağlamaktır. _controlfpkorumak ve giriş temizleme ve denormal deðerlerinin çýktýsýný yeni bir maske sağlar.
Intel (x 86) platformları destekleyen denormal giriş ve donanım değerleri çıktı. denormal değerleri korumak için davranıştır. _control87Bu davranışı değiştirmek için bir maske sağlamaz. Aşağıdaki örnekte bu farklılık gösterilmektedir:
_controlfp(_DN_SAVE, _MCW_DN);
// Denormal values preserved by software on ALPHA. NOP on x86.
_controlfp(_DN_FLUSH, _MCW_DN);
// Denormal values flushed to zero by hardware on ALPHA and x86
// processors with SSE2 support. Ignored on other x86 platforms.
Her ikisi de _control87 ve _controlfp x 87 hem de SSE2 için Denetim sözcükler varsa etkiler. İşlev __control87_2 x 87 hem de birlikte ya da ayrı ayrı kontrol SSE2 kayan nokta birimi sağlar. İki birim etkilemesini istiyorsanız, iki tamsayılar adreslerindeki geçmesi x86_cw ve sse2_cw. Yalnızca tek bir birim olarak etkiler istiyorsanız, bu parametre için bir adres geçmesi ancak diğeri için 0 (null) geçirin. 0 Bu parametrelerden biri verilmezse, işlev birimi işaret bu Yüzen üzerinde hiçbir etkisi yoktur. Bu işlevsellik, burada kod parçası kayan nokta birimi x 87 ve SSE2'ye kayan nokta birimi başka bir kod parçası kullanır durumlarda yararlı olabilir. Kullanırsanız, __control87_2 bir programın bir bölümünde ve kayan nokta için farklı değerler denetimi sözcükleri ayarlayın ve sonra _control87 veya _controlfp daha fazla denetim word sonra işlemek için _control87 ve _controlfp her iki Yüzen durumunu göstermek için tek bir denetim word döndüremedi olabilir birimleri'nın üzerine gelin. Böyle bir durumda, bu işlevler kümesi EM_AMBIGUOUS bayrak iki denetim sözcükler arasında bir tutarsızlık olduğunu belirtmek için döndürülen tamsayı değeri. Döndürülen denetim Word'ün her iki kayan nokta durumunu gösterebilir değil uyarı budur doğru sözcükleri denetlemek.
Üzerinde x64 mimarisi, Yüzen değiştirme noktası precision desteklenmiyor. Bu platformda precision denetim maske kullanılıyorsa, bir onaylama işlemi ve geçersiz parametre işleyici çağrıldığında, açıklandığı gibi Parametre doğrulama.
Not
__control87_2desteklenmez x64 mimarisi.Kullanırsanız, __control87_2 ve programınız için x64 mimarisi, derleyici bir hata üretir.
Bu işlevler ile derlerken itiraz /CLR (ortak dil çalışma zamanı derleme) veya /clr:pure common language runtime yalnızca varsayılan kayan nokta duyarlık desteklediği için.
Onaltılık değerler
İçin _MCW_EM maske temizleme maskesi donanım özel durum; sağlayan özel ayarlar maskesini ayarlarken, özel durum gizler. İse bir _EM_UNDERFLOW veya _EM_OVERFLOW hiçbir donanım exception Is Thrown'un kadar ileri bir kayan nokta yönergesi yürütüldüğünde oluşur. Donanım özel durum oluşturmak için hemen sonra _EM_UNDERFLOW veya _EM_OVERFLOW, FWAIT masm yönergesi arayın.
Maske |
Onaltılı değer |
Sabit |
Onaltılı değer |
---|---|---|---|
_MCW_DN(Denetim türü Mantis uyarlama) |
0x03000000 |
_DN_SAVE _DN_FLUSH |
0x00000000 0x01000000 |
_MCW_EM(Özel durum maskesi kesme) |
0x0008001F |
_EM_INVALID _EM_DENORMAL _EM_ZERODIVIDE _EM_OVERFLOW _EM_UNDERFLOW _EM_INEXACT |
0x00000010 0x00080000 0x00000008 0x00000004 0x00000002 0x00000001 |
_MCW_IC(Sonsuzluk denetimi) |
0x00040000 |
_IC_AFFINE _IC_PROJECTIVE |
0x00040000 0x00000000 |
_MCW_RCYuvarlama (Denetim) |
0x00000300 |
_RC_CHOP _RC_UP _RC_DOWN _RC_NEAR |
0x00000300 0x00000200 0x00000100 0x00000000 |
_MCW_PC(Precision denetimi) |
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 bilgileri için bkz: Uyumluluk giriş.
Örnek
// crt_cntrl87.c
// processor: x86
// 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;
// Show original x87 control word and do calculation.
control_word_x87 = __control87_2(0, 0,
&control_word_x87, 0);
printf( "Original: 0x%.4x\n", control_word_x87 );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
// Set precision to 24 bits and recalculate.
control_word_x87 = __control87_2(_PC_24, MCW_PC,
&control_word_x87, 0);
printf( "24-bit: 0x%.4x\n", control_word_x87 );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
// Restore default precision-control bits and recalculate.
control_word_x87 = __control87_2( _CW_DEFAULT, MCW_PC,
&control_word_x87, 0 );
printf( "Default: 0x%.4x\n", control_word_x87 );
printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );
}
Çıktı
Original: 0x0001
0.1 * 0.1 = 1.000000000000000e-002
24-bit: 0x0001
0.1 * 0.1 = 9.999999776482582e-003
Default: 0x0001
0.1 * 0.1 = 1.000000000000000e-002
.NET Framework Eşdeğeri
Yoktur. Standart c işlevi çağırmak için kullanmak PInvoke. Daha fazla bilgi için bkz: Platform Çağırma örnekleri.