Bagikan melalui


fp_contract pragma

Menentukan apakah kontraksi floating-point terjadi. Kontraksi floating-point adalah instruksi seperti Fused-Multiply-Add (FMA) yang menggabungkan dua operasi floating point terpisah ke dalam satu instruksi. Penggunaan instruksi ini dapat memengaruhi presisi floating-point, karena alih-alih membulatkan setelah setiap operasi, prosesor hanya dapat membulatkan sekali setelah kedua operasi.

Sintaks

#pragma fp_contract ( { on | off } )

Keterangan

Ketika Anda menggunakan opsi kompilator default, fp_contract adalah off, yang memberi tahu pengkompilasi untuk mempertahankan instruksi titik mengambang individual. Atur fp_contract ke on untuk menggunakan instruksi kontraksi floating-point jika memungkinkan. Perilaku ini baru di Visual Studio 2022 versi 17.0. Dalam versi kompilator sebelumnya, fp_contract default ke on.

Saat Anda menggunakan opsi kompilator default, fp_contract adalah on. Pengaturan ini memberi tahu pengkompilasi untuk menggunakan instruksi kontraksi floating-point jika memungkinkan. Atur fp_contract ke off untuk mempertahankan instruksi titik mengambang individual. Di Visual Studio 2022 versi 17.0 dan yang lebih baru, fp_contract default ke off.

Untuk informasi selengkapnya tentang perilaku floating-point, lihat /fp (Tentukan perilaku floating-point).

Arahan floating-point pragma lainnya meliputi:

Contoh

Opsi /fp:fast pengkompilasi memungkinkan kontraksi secara default, tetapi arahan #pragma fp_contract (off) dalam contoh ini menonaktifkannya. Kode yang dihasilkan dari sampel ini tidak akan menggunakan instruksi fused-multiply-add bahkan ketika tersedia pada prosesor target. Jika Anda mengomentari #pragma fp_contract (off), kode yang dihasilkan dapat menggunakan instruksi fused-multiply-add jika tersedia.

// 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

Lihat juga

Pragmadirektif dan __pragma kata kunci dan _Pragma