fp_contract
pragma
Kayan noktalı daralma olup olmadığını belirler. Kayan noktalı kasılma, iki ayrı kayan nokta işlemlerini tek bir yönergede birleştiren Fused-Multiply-Add (FMA) gibi bir yönergedir. Bu yönergelerin kullanılması kayan nokta duyarlığı etkileyebilir çünkü her işlemden sonra yuvarlama yerine işlemci her iki işlemden sonra yalnızca bir kez yuvarlayabilir.
Sözdizimi
#pragma fp_contract (
{on
|off
})
Açıklamalar
Varsayılan derleyici seçeneklerini kullandığınızda, fp_contract
derleyiciye tek tek kayan nokta yönergelerini korumasını söyleyen değeridir off
. on
Mümkün olduğunda kayan noktalı daralma yönergelerini kullanmak için olarak ayarlayınfp_contract
. Bu davranış Visual Studio 2022 sürüm 17.0'da yenidir. Önceki derleyici sürümlerinde fp_contract
varsayılan olarak on
olarak gösterilir.
Varsayılan derleyici seçeneklerini kullandığınızda, fp_contract
şeklindedir on
. Bu ayar derleyiciye mümkün olduğunda kayan noktalı daralma yönergelerini kullanmasını söyler. off
Tek tek kayan nokta yönergelerini korumak için olarak ayarlayınfp_contract
. Visual Studio 2022 sürüm 17.0 ve sonraki sürümlerde varsayılan fp_contract
olarak olur off
.
Kayan nokta davranışı hakkında daha fazla bilgi için bkz /fp
. (Kayan nokta davranışını belirtme).
Diğer kayan nokta pragma yönergeleri şunlardır:
Örnek
Derleyici /fp:fast
seçeneği, sözleşmeleri varsayılan olarak etkinleştirir, ancak bu örnekteki #pragma fp_contract (off)
yönerge bunları kapatır. Bu örnekten oluşturulan kod, hedef işlemcide kullanılabilir olsa bile bir fused-multiply-add yönergesi kullanmaz. açıklama satırı #pragma fp_contract (off)
yaparsanız, oluşturulan kod varsa fused-multiply-add yönergesi kullanabilir.
// pragma_directive_fp_contract.cpp
// On x86 and x64 compile with: /O2 /fp:fast /arch:AVX2
#include <stdio.h>
// remove the following line to enable FP contractions
#pragma fp_contract (off)
int main() {
double z, b, t;
for (int i = 0; i < 10; i++) {
b = i * 5.5;
t = i * 56.025;
z = t * i + b;
printf("out = %.15e\n", z);
}
}
out = 0.000000000000000e+00
out = 6.152500000000000e+01
out = 2.351000000000000e+02
out = 5.207249999999999e+02
out = 9.184000000000000e+02
out = 1.428125000000000e+03
out = 2.049900000000000e+03
out = 2.783725000000000e+03
out = 3.629600000000000e+03
out = 4.587525000000000e+03
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