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 (on
off
) 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 (on
off
) 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 on
precise
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_control
pragma nokta davranışının yalnızca bir bölümünü yönetir. Derleyici seçeneklerini yeniden oluşturmak /fp
için vepragmafenv_access
yö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:precise
ve /fp:strict
komut satırı seçeneklerini öykünmek için birkaç pragma yönergeyi /fp:fast
birlikte 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
except
on
için kullanabilirsinizfloat_control
. Hassas semantik, tarafından veyafloat_control
pragmaveya 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_control
pragma) kapatmakprecise
için kullanamazsınızfloat_control
.İster bir
float_control
pragma derleyici seçeneği olsun, kesin semantikler etkinleştirilmediği sürece etkinleştiremezsinizfenv_access
.Etkinleştirildiğinde
fenv_access
kapatmakprecise
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_control
pragmakatı 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 except
açıldığında precise
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_contract
pragma 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_control
taş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
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin