Bagikan melalui


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_accesspragma dalam kombinasi dengan pengaturan floating-point lainnya:

  • Anda tidak dapat mengaktifkan fenv_access kecuali semantik yang tepat diaktifkan. Semantik yang tepat dapat diaktifkan baik oleh float_controlpragma, 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 saat fenv_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(&currentControl, _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(&currentControl, _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

Lihat juga

Pragmadirektif dan __pragma kata kunci dan _Pragma