Aracılığıyla paylaş


float_control pragma

bir işlev için kayan nokta davranışını belirtir.

Sözdizimi

#pragma float_control
#pragma float_control( precise, { on | off } [ , push ] )
#pragma float_control( except, { on | off } [ , push ] )
#pragma float_control( { push | pop } )

Seçenekler

precise, on | off, push
Hassas kayan nokta semantiğinin etkinleştirilip etkinleştirilmeymeyeceğini (onoff) veya devre dışı bırakılıp devre dışı bırakılmayacağını belirtir. Derleyici seçeneğiyle /fp:precise arasındaki farklar hakkında bilgi için Açıklamalar bölümüne bakın. İsteğe bağlı push belirteç için geçerli ayarı float_control iç derleyici yığınına iletir.

except, on | off, push
Kayan nokta özel durum semantiğinin etkinleştirilip etkinleştirilmeymeyeceğini (onoff) veya devre dışı bırakılıp devre dışı bırakılmayacağını belirtir. İsteğe bağlı push belirteç için geçerli ayarı float_control iç derleyici yığınına iletir.

except yalnızca olarak da onprecise ayarlandığında olarak ayarlanabilir on.

push
Geçerli float_control ayarı iç derleyici yığınına iletir.

pop
float_control İç derleyici yığınının üst kısmından ayarı kaldırır ve bunu yeni float_control ayar yapar.

Açıklamalar

float_controlpragma derleyici seçeneğiyle aynı davranışa /fp sahip değildir. Kayan float_controlpragma nokta davranışının yalnızca bir bölümünü yönetir. Derleyici seçeneklerini yeniden oluşturmak /fp için vepragmafenv_accessyönergeleriyle fp_contract birleştirilmelidir. Aşağıdaki tabloda her derleyici seçeneği için eşdeğer pragma ayarlar gösterilmektedir:

Seçenek float_control(precise, *) float_control(except, *) fp_contract(*) fenv_access(*)
/fp:strict on on off on
/fp:precise on off off* off
/fp:fast off off on off

* Visual Studio'nun Visual Studio 2022 öncesi sürümlerinde, /fp:precise davranış varsayılan olarak şeklindedir fp_contract(on).

Seçenek float_control(precise, *) float_control(except, *) fp_contract(*) fenv_access(*)
/fp:strict on on off on
/fp:precise on off off off
/fp:fast off off on off

Başka bir deyişle, , /fp:preciseve /fp:strict komut satırı seçeneklerini öykünmek için birkaç pragma yönergeyi /fp:fastbirlikte kullanmanız gerekebilir.

ve fenv_access kayan nokta pragma yönergelerini float_control birlikte kullanmanın yolları üzerinde kısıtlamalar vardır:

  • Yalnızca hassas semantikler etkinse olarak ayarlamak excepton için kullanabilirsinizfloat_control. Hassas semantik, tarafından veya float_controlpragmaveya derleyici seçenekleri kullanılarak /fp:precise/fp:strict etkinleştirilebilir.

  • Özel durum semantiği etkinleştirildiğinde (bir derleyici seçeneğiyle veya /fp:except bir derleyici seçeneğiylefloat_controlpragma) kapatmak precise için kullanamazsınızfloat_control.

  • İster bir float_controlpragma derleyici seçeneği olsun, kesin semantikler etkinleştirilmediği sürece etkinleştiremezsinizfenv_access.

  • Etkinleştirildiğinde fenv_access kapatmak precise için kullanamazsınızfloat_control.

Bu kısıtlamalar, bazı kayan nokta pragma yönergelerinin sırasının önemli olduğu anlamına gelir. Yönergeleri kullanarak pragma hızlı bir modelden katı bir modele geçmek için aşağıdaki kodu kullanın:

#pragma float_control(precise, on)  // enable precise semantics
#pragma fenv_access(on)             // enable environment sensitivity
#pragma float_control(except, on)   // enable exception semantics
#pragma float_control(precise, on)  // enable precise semantics
#pragma fenv_access(on)             // enable environment sensitivity
#pragma float_control(except, on)   // enable exception semantics
#pragma fp_contract(off)            // disable contractions

kullanarak float_controlpragmakatı bir modelden hızlı bir modele geçmek için aşağıdaki kodu kullanın:

#pragma float_control(except, off)  // disable exception semantics
#pragma fenv_access(off)            // disable environment sensitivity
#pragma float_control(precise, off) // disable precise semantics
#pragma fp_contract(on)             // enable contractions

Hiçbir seçenek belirtilmezse, float_control hiçbir etkisi olmaz.

yönergesi float_control veya exceptaçıldığında precise kasılmaları devre dışı bırakır. float_controlprecise Önceki ayarı kapatmak veya except eski durumuna döndürmek için kullanma. Yönergesini fp_contractpragma kullanarak, sözleşmelerde derleyici davranışını değiştirebilirsiniz. float_control(push) ve float_control(pop) iç derleyici yığınına ayarın float_control bir parçası olarak kasılmalar ayarını gönderip açın. Bu davranış Visual Studio 2022'de yenidir. float_control Önceki derleyici sürümlerindeki yönerge, daralma ayarlarını etkilemedi.

Örnek

Aşağıdaki örnekte kullanılarak pragmafloat_controltaşma kayan nokta özel durumunun nasıl yakalandığı gösterilmektedir.

// pragma_directive_float_control.cpp
// compile with: /EHa
#include <stdio.h>
#include <float.h>

double func( ) {
   return 1.1e75;
}

#pragma float_control (except, on)

int main( ) {
   float u[1];
   unsigned int currentControl;
   errno_t err;

   err = _controlfp_s(&currentControl, ~_EM_OVERFLOW, _MCW_EM);
   if (err != 0)
      printf_s("_controlfp_s failed!\n");

   try  {
      u[0] = func();
      printf_s ("Fail");
      return(1);
   }

   catch (...)  {
      printf_s ("Pass");
      return(0);
   }
}
Pass

Ayrıca bkz.

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