Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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_control
pragma 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_contract için vefenv_accesspragmayönergeleriyle /fp 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, , pragmave /fp:fast komut satırı seçeneklerini öykünmek için birkaç /fp:precise yönergeyi /fp:strictbirlikte kullanmanız gerekebilir.
ve float_control kayan nokta fenv_access yönergelerini pragma birlikte kullanmanın yolları üzerinde kısıtlamalar vardır:
Yalnızca hassas semantikler etkinse olarak ayarlamak
float_controlexceptiçin kullanabilirsinizon. Hassas semantik, tarafından veyafloat_controlpragmaveya derleyici seçenekleri kullanılarak/fp:precise/fp:strictetkinleştirilebilir.Özel durum semantiği etkinleştirildiğinde (bir derleyici seçeneğiyle veya
float_controlbir derleyici seçeneğiyleprecisefloat_control) kapatmak pragma için kullanamazsınız/fp:except.İster bir
fenv_accessfloat_controlderleyici seçeneği olsun, kesin semantikler etkinleştirilmediği sürece etkinleştiremezsinizpragma.Etkinleştirildiğinde
float_controlkapatmakpreciseiçin kullanamazsınızfenv_access.
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 preciseaçıldığında except kasılmaları devre dışı bırakır.
float_control
precise Ö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(¤tControl, ~_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