Udostępnij za pośrednictwem


/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

  1. Otwórz okno dialogowe projektu Strony właściwości.Szczegółowe informacje – zobacz: Porady: otwieranie stron właściwości projektów.

  2. Rozwiń węzeł Właściwości konfiguracji.

  3. Rozwiń węzeł C/C++.

  4. Wybierz stronę właściwości Generowanie kodu.

  5. Zmodyfikuj właściwość Model zmiennoprzecinkowy.

Aby programowo ustawić tę opcję kompilatora

Zobacz też

Informacje

Opcje kompilatora

Ustawianie opcji kompilatora

Inne zasoby

Optymalizacja zmiennopozycyjna Microsoft Visual C++