Bagikan melalui


_control87, _controlfp, __control87_2

Mendapatkan dan mengatur kata kontrol floating-point. Versi yang lebih aman tersedia _controlfp ; lihat _controlfp_s.

Sintaks

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
);

Parameter

new
Nilai bit kata kontrol baru.

mask
Masking untuk bit kata kontrol baru yang akan diatur.

x86_cw
Diisi dengan kata kontrol untuk unit titik mengambang x87. Teruskan 0 (NULL) untuk hanya mengatur kata kontrol SSE2.

sse2_cw
Mengontrol kata untuk unit floating-point SSE. Teruskan 0 (NULL) untuk mengatur hanya kata kontrol x87.

Nilai hasil

Untuk _control87 dan _controlfp, bit dalam nilai yang dikembalikan menunjukkan status kontrol floating-point. Untuk definisi lengkap bit yang dikembalikan oleh _control87, lihat FLOAT.H.

Untuk __control87_2, nilai yang dikembalikan adalah 1, yang menunjukkan keberhasilan.

Keterangan

Fungsi ini _control87 mendapatkan dan mengatur kata kontrol floating-point. Kata kontrol floating-point memungkinkan program untuk mengubah mode presisi, pembulatan, dan tak terbatas, tergantung pada platform. Anda juga dapat menggunakan _control87 untuk menutupi atau membuka kemasan pengecualian floating-point. Jika nilai untuk mask sama dengan 0, _control87 mendapatkan kata kontrol floating-point. Jika mask bukan nol, nilai baru untuk kata kontrol diatur: Untuk bit apa pun yang aktif (yaitu, sama dengan 1) di mask, bit yang sesuai di new digunakan untuk memperbarui kata kontrol. Dengan kata lain, fpcntrl = ((fpcntrl & ~mask) | (new & mask)) di mana fpcntrl adalah kata kontrol floating-point.

Catatan

Secara default, pustaka run-time menutupi semua pengecualian floating-point.

_controlfpadalah versi _control87 portabel independen platform yang hampir identik dengan fungsi._control87 Jika kode Anda menargetkan lebih dari satu platform, gunakan _controlfp atau _controlfp_s. Perbedaan antara _control87 dan _controlfp adalah bagaimana mereka memperlakukan DENORMAL nilai. Untuk platform x86, x64, ARM, dan ARM64, _control87 dapat mengatur dan menghapus DENORMAL OPERAND masker pengecualian. _controlfp tidak mengubah DENORMAL OPERAND masker pengecualian. Contoh ini menunjukkan perbedaannya:

_control87( _EM_INVALID, _MCW_EM );
// DENORMAL is unmasked by this call
_controlfp( _EM_INVALID, _MCW_EM );
// DENORMAL exception mask remains unchanged

Nilai yang mungkin untuk konstanta mask (mask) dan nilai kontrol baru (new) diperlihatkan dalam tabel Kontrol kata mask dan nilai. Gunakan konstanta portabel yang tercantum di bawah ini (_MCW_EM, _EM_INVALID, dan sebagainya) sebagai argumen untuk fungsi-fungsi ini, daripada menyediakan nilai heksadesimal secara eksplisit.

Platform turunan Intel x86 mendukung DENORMAL nilai input dan output dalam perangkat keras. Perilaku x86 adalah mempertahankan DENORMAL nilai. Platform ARM dan ARM64 dan platform x64 yang memiliki dukungan SSE2 memungkinkan DENORMAL operand dan hasil untuk dibersihkan, atau dipaksa ke nol. Fungsi _controlfp dan _control87 menyediakan masker untuk mengubah perilaku ini. Contoh berikut menunjukkan penggunaan masker ini.

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

Pada platform ARM dan ARM64, _control87 fungsi dan _controlfp berlaku untuk register FPSCR. Hanya kata kontrol SSE2 yang disimpan dalam register MXCSR yang terpengaruh pada platform x64. Pada platform x86, _control87 dan _controlfp mempengaruhi kata-kata kontrol untuk x87 dan SSE2, jika ada.

Fungsi __control87_2 ini memungkinkan unit floating-point x87 dan SSE2 dikontrol bersama-sama atau terpisah. Untuk memengaruhi kedua unit, teruskan alamat dua bilangan bulat ke x86_cw dan sse2_cw. Jika Anda hanya ingin memengaruhi satu unit, teruskan alamat untuk parameter tersebut, tetapi teruskan 0 (NULL) untuk unit lainnya. Jika 0 diteruskan untuk salah satu parameter ini, fungsi tidak berpengaruh pada unit floating-point tersebut. Ini berguna ketika bagian dari kode Anda menggunakan unit floating-point x87, dan bagian lain menggunakan unit floating-point SSE2.

Jika Anda menggunakan __control87_2 untuk mengatur nilai yang berbeda untuk kata-kata kontrol floating-point, maka _control87 atau _controlfp mungkin tidak dapat mengembalikan satu kata kontrol untuk mewakili status kedua unit floating-point. Dalam kasus seperti itu, fungsi-fungsi ini mengatur EM_AMBIGUOUS bendera dalam nilai bilangan bulat yang dikembalikan untuk menunjukkan ketidakkonsistensian antara dua kata kontrol. Bendera EM_AMBIGUOUS adalah peringatan bahwa kata kontrol yang dikembalikan mungkin tidak mewakili status kedua kata kontrol floating-point secara akurat.

Pada platform ARM, ARM64, dan x64, mengubah mode tak terbatas atau presisi floating-point tidak didukung. Jika masker kontrol presisi digunakan pada platform x64, fungsi meningkatkan pernyataan, dan handler parameter yang tidak valid dipanggil, seperti yang dijelaskan dalam Validasi parameter.

Catatan

__control87_2 tidak didukung pada platform ARM, ARM64, atau x64. Jika Anda menggunakan __control87_2 dan mengkompilasi program untuk platform ARM, ARM64, atau x64, pengkompilasi akan menghasilkan kesalahan.

Fungsi-fungsi ini diabaikan saat Anda menggunakan /clr (Kompilasi Runtime Bahasa Umum) untuk dikompilasi. Runtime bahasa umum (CLR) hanya mendukung presisi floating-point default.

Mengontrol masker dan nilai kata

_MCW_EM Untuk masker, membersihkan masker menetapkan pengecualian, yang memungkinkan pengecualian perangkat keras; mengatur masker menyembunyikan pengecualian. Jika atau _EM_UNDERFLOW_EM_OVERFLOW terjadi, tidak ada pengecualian perangkat keras yang dilemparkan hingga instruksi floating-point berikutnya dijalankan. Untuk menghasilkan pengecualian perangkat keras segera setelah _EM_UNDERFLOW atau _EM_OVERFLOW, panggil FWAIT instruksi MASM.

Mask Nilai heks Terus-menerus Nilai heks
_MCW_DN (Denormal kontrol) 0x03000000 _DN_SAVE

_DN_FLUSH
0x00000000

0x01000000
_MCW_EM (Mengganggu masker pengecualian) 0x0008001F _EM_INVALID

_EM_DENORMAL

_EM_ZERODIVIDE

_EM_OVERFLOW

_EM_UNDERFLOW

_EM_INEXACT
0x00000010

0x00080000

0x00000008

0x00000004

0x00000002

0x00000001
_MCW_IC (Kontrol tak terbatas)

(Tidak didukung pada platform ARM atau x64.)
0x00040000 _IC_AFFINE

_IC_PROJECTIVE
0x00040000

0x00000000
_MCW_RC (Kontrol pembulatan) 0x00000300 _RC_CHOP

_RC_UP

_RC_DOWN

_RC_NEAR
0x00000300

0x00000200

0x00000100

0x00000000
_MCW_PC (Kontrol presisi)

(Tidak didukung pada platform ARM atau x64.)
0x00030000 _PC_24 (24 bit)

_PC_53 (53 bit)

_PC_64 (64 bit)
0x00020000

0x00010000

0x00000000

Persyaratan

Rutin Header yang diperlukan
_control87, _controlfp, _control87_2 <float.h>

Untuk informasi kompatibilitas selengkapnya, lihat Kompatibilitas.

Contoh

// 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

Baca juga

Dukungan matematika dan titik mengambang
_clear87, _clearfp
_status87, _statusfp, _statusfp2
_controlfp_s