Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Menonaktifkan (on) atau mengaktifkan (off) pengoptimalan yang dapat mengubah pengujian bendera lingkungan floating-point dan perubahan mode.
Sintaks
#pragma fenv_access ({on|off})
Keterangan
Secara default, fenv_access adalah off. Kompilator mengasumsikan kode Anda tidak mengakses atau memanipulasi lingkungan floating-point. Jika akses lingkungan tidak diperlukan, pengkompilasi dapat melakukan lebih banyak untuk mengoptimalkan kode floating-point Anda.
Aktifkan fenv_access jika kode Anda menguji bendera status floating-point, pengecualian, atau mengatur bendera mode kontrol. Kompilator menonaktifkan pengoptimalan floating-point, sehingga kode Anda dapat mengakses lingkungan floating-point secara konsisten.
Opsi /fp:strict baris perintah secara otomatis mengaktifkan fenv_access. Untuk informasi selengkapnya tentang ini dan perilaku floating-point lainnya, lihat /fp (Tentukan Perilaku Titik Mengambang).
Ada batasan pada cara Anda dapat menggunakan fenv_accesspragma dalam kombinasi dengan pengaturan floating-point lainnya:
Anda tidak dapat mengaktifkan
fenv_accesskecuali semantik yang tepat diaktifkan. Semantik yang tepat dapat diaktifkan baik olehfloat_controlpragma, atau dengan menggunakan/fp:preciseopsi atau/fp:strictpengkompilasi. Pengkompilasi default ke/fp:precisejika tidak ada opsi baris perintah floating-point lainnya yang ditentukan.Anda tidak dapat menggunakan
float_controluntuk menonaktifkan semantik yang tepat saatfenv_access(on)diatur.
Direktif fenv_access(on) menonaktifkan pembuatan kontraksi floating-point, instruksi mesin yang menggabungkan operasi floating-point.
fenv_access(off) memulihkan perilaku sebelumnya untuk kontraksi. Perilaku ini baru di Visual Studio 2022. Versi kompilator sebelumnya dapat menghasilkan kontraksi secara default di bawah fenv_access(on). Untuk informasi selengkapnya tentang kontraksi floating-point, lihat /fp:contract.
Jenis pengoptimalan yang tunduk pada fenv_access :
Eliminasi subekspresi umum global
Gerakan kode
Pelipatan konstanta
Arahan floating-point pragma lainnya meliputi:
Contoh
Contoh ini mengatur fenv_access ke untuk on mengatur register kontrol floating-point untuk presisi 24-bit:
// pragma_directive_fenv_access_x86.cpp
// compile with: /O2 /arch:IA32
// processor: x86
#include <stdio.h>
#include <float.h>
#include <errno.h>
#pragma fenv_access (on)
int main() {
double z, b = 0.1, t = 0.1;
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, _PC_24, _MCW_PC);
if (err != 0) {
printf_s("The function _controlfp_s failed!\n");
return -1;
}
z = b * t;
printf_s ("out=%.15e\n",z);
}
out=9.999999776482582e-03
Jika Anda mengomentari #pragma fenv_access (on) dari sampel sebelumnya, outputnya berbeda. Ini karena pengkompilasi melakukan evaluasi waktu kompilasi, yang tidak menggunakan mode kontrol.
// pragma_directive_fenv_access_2.cpp
// compile with: /O2 /arch:IA32
#include <stdio.h>
#include <float.h>
int main() {
double z, b = 0.1, t = 0.1;
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, _PC_24, _MCW_PC);
if (err != 0) {
printf_s("The function _controlfp_s failed!\n");
return -1;
}
z = b * t;
printf_s ("out=%.15e\n",z);
}
out=1.000000000000000e-02