_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.
_controlfp
adalah 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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk