/fp (Określenie zachowania zmiennoprzecinkowego)
Określa zachowanie liczb zmiennopozycyjnych w pliku kodu źródłowego.
/fp:[precise | except[-] | fast | strict ]
Flagi
precise
Domyślnie.Zwiększa spójność testów zmiennopozycyjnych na równość i nierówność, wyłączając optymalizacje, które mogą zmienić dokładność wykonywania obliczeń zmiennopozycyjnych. (Zachowanie określonej dokładności jest wymagane, aby uzyskać pełną zgodność z ANSI). Domyślnie, w kodzie dla architektur x86, kompilator używa 80-bitowych rejestrów koprocesora do przechowywania wyników pośrednich obliczeń zmiennopozycyjnych.Zwiększa to szybkość działania programu i zmniejsza jego rozmiar.Ponieważ jednak obliczanie obejmuje typy danych zmiennopozycyjnych, które są reprezentowane w pamięci przez mniej niż 80 bitów, dołączanie dodatkowych bitów precyzji (80 bitów pomniejszone o liczbę bitów w mniejszym typie zmiennopozycyjnym) w trakcie długich obliczeń może wygenerować niespójne wyniki.
Z /fp:precise na procesorach x86, kompilator wykonuje zaokrąglanie dla zmiennych typu float, z dokładnością odpowiednią dla przydziałów i rzutowania i gdy parametry są przekazywane do funkcji.To zaokrąglanie gwarantuje, że dane nie zachowują żadnego znaczenia większego od pojemności ich typu.Program skompilowany z /fp:precise może być wolniejszy i większy niż skompilowany bez /fp:precise./fp:precise wyłącza funkcje wewnętrzne; zamiast tego jest używana standardowa biblioteka środowiska uruchomieniowego.Aby uzyskać więcej informacji, zobacz /Oi (Generuj funkcje wewnętrzne).
Następujące zachowanie zmiennopozycyjne jest włączone z /fp:precise:
Skracanie — czyli stosowanie złożonej operacji, w której wykonuje się tylko jedno zaokrąglenie w punkcie końcowym, aby zastąpić wiele operacji.
Optymalizacje wyrażeń, które są nieprawidłowe dla specjalnych wartości (NaN, +nieskończoność, -nieskończoność, +0, -0), nie są dozwolone.Optymalizacje x-x => 0, x*0 => 0, x-0 => x, x+0 => x i 0-x => -x są nieprawidłowe z różnych powodów. (Zobacz norma IEEE 754 i C99).
Kompilator poprawnie przetwarza porównania obejmujące NaN.Na przykład x != x daje w wyniku true, jeśli x jest NaN i uporządkowane porównania używające NaN zgłaszają wyjątek.
Obliczanie wyrażenia następuje po C99 FLT_EVAL_METHOD=2, z następującym wyjątkiem: gdy programuje się dla architektury procesorów x86, ponieważ FPU jest ustawiony na 53-bitową precyzję, uznaje się to za precyzję long-double.
Mnożenie przez dokładnie 1.0 jest przekształcane na zastosowanie innego mnożnika.x*y*1.0 jest przekształcane na x*y.Podobnie x*1.0*y jest przekształcane na x*y.
Dzielenie przez dokładnie 1.0 jest przekształcane na zastosowanie dzielnej.x*y/1.0 jest przekształcane na x*y.Podobnie x/1.0*y jest przekształcane na x*y.
Stosowanie /fp:precise, gdy fenv_access jest ustawione na ON, wyłącza optymalizacje, takie jak szacowanie w czasie kompilacji wyrażeń liczb zmiennopozycyjnych.Na przykład, jeśli _control87, _controlfp, __control87_2 zostanie użyte do zmiany trybu zaokrąglania, a kompilator wykonuje obliczenie zmiennopozycyjne, określony tryb zaokrąglania nie będzie obowiązywał, chyba że fenv_access jest włączone.
/fp:precise zamienia opcję kompilatora /Op.
fast
Tworzy najszybszy kod w większości przypadków, ponieważ nakłada mniej restrykcyjne zasady optymalizacji operacji zmiennopozycyjnych.Pozwala to kompilatorowi na optymalizację kodu zmiennopozycyjnego pod kątem szybkości, kosztem dokładności i poprawności.Gdy /fp:fast jest określone, kompilator może niepoprawnie zaokrąglać w instrukcjach przypisania, rzutowaniach typu lub wywołaniach funkcji i może nie zaokrąglać wyrażeń pośrednich.Kompilator może zmienić kolejność operacji lub wykonywać przekształcenia algebraiczne — na przykład, według zasad łączności i rozdzielności — bez względu na ich wpływ na wyniki skończonej precyzji.Kompilator może zmienić operacje i operandy na te o pojedynczej precyzji, zamiast zachowywać reguły promocji typu C++.Optymalizacje skracania typowe dla obliczeń zmiennopozycyjnych są zawsze włączone (fp_contract jest ustawione na ON).Wyjątki obliczeń zmiennopozycyjnych i dostęp do środowiska FPU są wyłączone (/fp:except- jest implikowane, a fenv_access jest ustawione na OFF)./fp:fast nie może być używane z /fp:strict lub /fp:precise.Używana jest ostatnia opcja określona w wierszu polecenia.Określenie zarówno /fp:fast, jak i /fp:except generuje błąd kompilatora.
Określenie /Za, /Ze (Wyłącz rozszerzenia językowe) (zgodność z ANSI) i /fp:fast może spowodować nieoczekiwane zachowanie.Na przykład, operacje zmiennopozycyjne o pojedynczej precyzji mogą nie zostać zaokrąglone do pojedynczej precyzji.
except[-]
Wiarygodny model wyjątków zmiennopozycyjnych.Wyjątki są zgłaszane natychmiast po ich wygenerowaniu.Domyślnie ta opcja jest wyłączona.Dołączanie znaku minusa do opcji wyłącza ją jawnie.strict
Najbardziej restrykcyjny model zmiennopozycyjny./fp:strict powoduje, że fp_contract jest ustawione na OFF, a fenv_access na ON./fp:except jest implikowane i może być wyłączone przez jawne określenie /fp:except-.Gdy jest używane z /fp:except-, /fp:strict wymusza ścisłą semantykę liczb zmiennopozycyjnych, ale bez uwzględniania zdarzeń wyjątkowych.
Uwagi
W tej samej kompilacji można określić wiele opcji /fp.
Aby kontrolować zachowanie liczb zmiennopozycyjnych za pomocą funkcji, zobacz dyrektywę float_control.Zastępuje to ustawienie kompilatora /fp.Zalecamy zapisywanie i przywracanie lokalnego zachowania liczb zmiennopozycyjnych jako dobrą praktykę programistyczną:
#pragma float_control(precise, on, push)
// Code that uses /fp:precise mode
#pragma float_control(pop)
Większość optymalizacji zmiennopozycyjnych związanych z /fp:strict, /fp:except (i odnośnymi dyrektywami) i dyrektywą fp_contract jest zależna od komputera./fp:strict i /fp:except nie są zgodne z /clr.
/fp:precise powinno dotyczyć większości wymagań zmiennopozycyjnych aplikacji.Możesz użyć /fp:except i /fp:strict, ale może wystąpić spadek wydajności.Jeśli wydajność jest najważniejsza, rozważ użycie /fp:fast.
/fp:strict, /fp:fast i /fp:precise są trybami precyzji (dokładności).Tylko jeden może być wdrożony w tym samym czasie.Jeśli są określone /fp:strict i /fp:precise naraz, kompilator używa tego, który był przetwarzany jako ostatni.Nie można określić /fp:strict i /fp:fast naraz.
Aby uzyskać więcej informacji, zobacz Optymalizacja zmiennopozycyjna Microsoft Visual C++.
Aby ustawić tę opcję kompilatora w środowisku programowania Visual Studio
Otwórz okno dialogowe projektu Strony właściwości.Szczegółowe informacje – zobacz: Porady: otwieranie stron właściwości projektów.
Rozwiń węzeł Właściwości konfiguracji.
Rozwiń węzeł C/C++.
Wybierz stronę właściwości Generowanie kodu.
Zmodyfikuj właściwość Model zmiennoprzecinkowy.
Aby programowo ustawić tę opcję kompilatora
- Zobacz floatingPointModel.