Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Determina se a contração do ponto flutuante ocorre. Uma contração de ponto flutuante é uma instrução como Fused-Multiply-Add (FMA) que combina duas operações de ponto flutuante separadas em uma única instrução. O uso dessas instruções pode afetar a precisão do ponto flutuante, porque em vez de arredondar após cada operação, o processador pode arredondar apenas uma vez após ambas as operações.
Sintaxe
#pragma fp_contract ({on|off})
Comentários
Quando você usa as opções padrão do compilador, fp_contract é off, que diz ao compilador para preservar instruções individuais de ponto flutuante. Defina fp_contract para on usar instruções de contração de ponto flutuante sempre que possível. Esse comportamento é novo no Visual Studio 2022 versão 17.0. Em versões anteriores do compilador, fp_contract padrão para on.
Quando você usa as opções padrão do compilador, fp_contract é on. Essa configuração diz ao compilador para usar instruções de contração de ponto flutuante sempre que possível. Defina fp_contract para off para preservar instruções individuais de ponto flutuante. No Visual Studio 2022 versão 17.0 e posterior, fp_contract assume como padrão off.
Para obter mais informações sobre o comportamento de ponto flutuante, consulte /fp (Especificar comportamento de ponto flutuante).
Outras diretivas pragma de ponto flutuante incluem:
Exemplo
A opção /fp:fast compilador permite contrações por padrão, mas a diretiva #pragma fp_contract (off) neste exemplo as desativa. O código gerado a partir deste exemplo não usará uma instrução fusível-multiplicar-adicionar, mesmo quando estiver disponível no processador de destino. Se você comentar #pragma fp_contract (off), o código gerado pode usar uma instrução fusível-multiplicar-adicionar, se estiver disponível.
// 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