Aracılığıyla paylaş


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

Ayrıca bkz.

Başvuru

Kayan nokta türü desteği

_clear87, _clearfp

_status87, _statusfp, _statusfp2