Aracılığıyla paylaş


fenv_access pragma

Kayan nokta ortam bayrak testlerini ve mod değişikliklerini değiştirebilecek iyileştirmeleri devre dışı bırakır (on) veya etkinleştirir (off).

Sözdizimi

#pragma fenv_access ( { on | off } )

Açıklamalar

Varsayılan olarak, fenv_access şeklindedir off. Derleyici, kodunuzun kayan nokta ortamına erişmediği veya bu ortamı işlemediği varsayılır. Ortam erişimi gerekli değilse, derleyici kayan nokta kodunuzu iyileştirmek için daha fazlasını yapabilir.

Kodunuz kayan nokta durum bayraklarını, özel durumları sınarsa veya denetim modu bayraklarını ayarlarsa etkinleştirin fenv_access . Derleyici kayan nokta iyileştirmelerini devre dışı bırakır, böylece kodunuz kayan nokta ortamına tutarlı bir şekilde erişebilir.

/fp:strict Komut satırı seçeneği otomatik olarak etkinleştirirfenv_access. Bu ve diğer kayan nokta davranışı hakkında daha fazla bilgi için bkz . /fp (Kayan Nokta Davranışını Belirtme).

öğesini diğer kayan nokta ayarlarıyla birlikte kullanmanın fenv_accesspragma yolları üzerinde kısıtlamalar vardır:

  • Kesin semantikler etkinleştirilmediği sürece etkinleştiremezsiniz fenv_access . Hassas semantik, tarafından veya float_controlpragmaveya derleyici seçenekleri kullanılarak /fp:precise/fp:strict etkinleştirilebilir. Başka bir kayan nokta komut satırı seçeneği belirtilmezse derleyici varsayılan olarak /fp:precise ayarlanır.

  • Ayarlandığında hassas semantiği fenv_access(on) devre dışı bırakmak için kullanamazsınızfloat_control.

yönergesi fenv_access(on) , kayan nokta işlemlerini birleştiren makine yönergeleri olan kayan noktalı kasılmaların oluşturulmasını devre dışı bırakır. fenv_access(off) kasılmalar için önceki davranışı geri yükler. Bu davranış Visual Studio 2022'de yenidir. Önceki derleyici sürümleri altında fenv_access(on)varsayılan olarak sözleşmeler oluşturabilir. Kayan noktalı kasılmalar hakkında daha fazla bilgi için bkz /fp:contract. .

Tabi olan iyileştirme türleri şunlardır fenv_access :

  • Genel ortak alt ifade ortadan kaldırma

  • Kod hareketi

  • Sabit katlama

Diğer kayan nokta pragma yönergeleri şunlardır:

Örnekler

Bu örnek, kayan nokta denetim yazmaç değerini 24 bit duyarlık için ayarlı olarak ayarlar fenv_accesson :

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

Önceki örnekten açıklama satırı #pragma fenv_access (on) yaparsanız çıkış farklıdır. Bunun nedeni, derleyicinin denetim modunu kullanmayan derleme zamanı değerlendirmesi yapıyor olmasıdır.

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

Ayrıca bkz.

Pragma yönergeleri ve __pragma ve _Pragma anahtar sözcükleri