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_access
pragma yolları üzerinde kısıtlamalar vardır:
Kesin semantikler etkinleştirilmediği sürece etkinleştiremezsiniz
fenv_access
. Hassas semantik, tarafından veyafloat_control
pragmaveya 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_access
on
:
// 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(¤tControl, _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(¤tControl, _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
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