fenv_access
pragma
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_access
pragma dalam kombinasi dengan pengaturan floating-point lainnya:
Anda tidak dapat mengaktifkan
fenv_access
kecuali semantik yang tepat diaktifkan. Semantik yang tepat dapat diaktifkan baik olehfloat_control
pragma, atau dengan menggunakan/fp:precise
opsi atau/fp:strict
pengkompilasi. Pengkompilasi default ke/fp:precise
jika tidak ada opsi baris perintah floating-point lainnya yang ditentukan.Anda tidak dapat menggunakan
float_control
untuk 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