/fp (zadání chování hodnot s plovoucí desetinnou čárkou)
Určuje chování plovoucí desetinné čárky v souboru zdrojového kódu.
/fp:[precise | except[-] | fast | strict ]
Příznaky
precise
Výchozí nastaveníZlepšuje konzistenci testů čísel s plovoucí desetinnou čárkou na rovnost a nerovnost zakázáním optimalizací, které by mohly změnit přesnost výpočtů s plovoucí desetinnou čárkou. (Zachování určité přesnosti se vyžaduje pro striktní dodržování ANSI.) V kódu pro architekturu x86 kompilátor standardně používá 80bitové registry koprocesoru, v nichž uchovává průběžné výsledky výpočtů s plovoucí desetinnou čárkou.To zvyšuje rychlost programu a snižuje jeho velikost.Protože však výpočty zahrnují datové typy s plovoucí desetinnou čárkou reprezentované v paměti méně než 80 bity, může přenos dodatečných bitů přesnosti (80 bitů minus počet bitů v menším typu s plovoucí desetinnou čárkou) napříč delším výpočtem zapříčinit nekonzistentní výsledky.
Je-li u procesorů x86 použit parametr /fp:precise, kompilátor při přiřazení, přetypování a předání parametrů funkci zaokrouhlí proměnné typu float na správnou přesnost.Toto zaokrouhlení zaručuje, že si data nezachovají větší platnost, než je kapacita jejich typu.Program zkompilovaný s parametrem /fp:precise může být pomalejší a větší než program zkompilovaný bez parametru /fp:precise.Parametr /fp:precise zakazuje vnitřní volání. Namísto nich jsou použity standardní rutiny knihoven runtime.Další informace naleznete v tématu /Oi (Generovat vnitřní funkce).
Při použití parametru /fp:precise je povoleno následující chování čísel s plovoucí desetinnou čárkou:
Zkrácení – použití složené operace, která provede pouze jedno zaokrouhlení na konci a nahrazuje více operací.
Optimalizace výrazů, které jsou neplatné pro zvláštní hodnoty (NaN, +nekonečno, -nekonečno, +0, -0), nejsou povoleny.Optimalizace x-x => 0, x*0 => 0, x-0 => x, x+0 => x a 0-x => -x jsou z různých důvodů neplatné. (Viz IEEE 754 a standard C99.)
Kompilátor správně zpracovává porovnání, která zahrnují hodnotu NaN.Například výraz x != x je vyhodnocen na hodnotu true, má-li proměnná x hodnotu NaN a vyvolávají-li seřazená porovnání s hodnotou NaN výjimku.
Vyhodnocení výrazů dodržuje metodu FLT_EVAL_METHOD=2 standardu C99 s touto výjimkou: pokud je program určen pro procesory x86, považuje se to za přesnost long-double, protože jednotka FPU je nastavena na 53bitovou přesnost.
Násobení hodnotou přesně 1,0 se transformuje na použití druhého činitele.x*y*1.0 se transformuje na x*y.Obdobně x*1.0*y se transformuje na x*y.
Dělení hodnotou přesně 1,0 se transformuje na použití dělence.x*y/1.0 se transformuje na x*y.Obdobně x/1.0*y se transformuje na x*y.
Při použití parametru /fp:precise v případech, kdy je zapnuto fenv_access, se zakážou optimalizace, například vyhodnocení výrazů s plovoucí desetinnou čárkou během kompilace.Pokud například použijete _control87, _controlfp, __control87_2 ke změně režimu zaokrouhlování a kompilátor provede výpočet s plovoucí desetinnou čárkou, nebude zadaný režim zaokrouhlování platit, pokud nebude fenv_access zapnuto.
Parametr /fp:precise nahrazuje parametr kompilátoru /Op.
fast
Vytvoří ve většině případů nejrychlejší kód zmírněním pravidel pro optimalizaci operací s plovoucí desetinnou čárkou.To umožňuje, aby kompilátor optimalizoval kód výpočtů s plovoucí desetinnou čárkou na rychlost na úkor přesnosti a správnosti.Při zadání parametru /fp:fast nemusí kompilátor správně zaokrouhlovat přiřazovací příkazy, přetypování nebo volání funkcí a nemusí provádět zaokrouhlování přechodných výrazů.Kompilátor může změnit pořadí operací nebo provádět algebraické transformace – například dodržováním asociativních a distributivních pravidel – bez ohledu na vliv na konečnou přesnost výsledků.Kompilátor může operace a operandy změnit na jednoduchou přesnost a nemusí dodržovat pravidla povyšování typů jazyka C++.Optimalizace zkrácení specifického pro plovoucí desetinnou čárku jsou vždy povoleny (fp_contract je zapnuto).Výjimky plovoucí desetinné čárky a přístup k prostředí jednotky FPU jsou zakázány (předpokládá se /fp:except- a fenv_access je vypnuto).Parametr /fp:fast nelze použít s parametrem /fp:strict ani /fp:precise.Použije se poslední parametr zadaný na příkazovém řádku.Při zadání parametru /fp:fast i /fp:except se vygeneruje chyba kompilátoru.
Zadání parametrů /Za, /Ze (Zakázat jazyková rozšíření) (kompatibilita s ANSI) a /fp:fast může způsobit neočekávané chování.Například operace s plovoucí desetinnou čárkou s jednoduchou přesností nemusejí být zaokrouhleny na jednoduchou přesnost.
except[-]
Spolehlivý model výjimek s plovoucí desetinnou čárkouVýjimky jsou vyvolány okamžitě po aktivaci.Tento parametr je standardně vypnutý.Připojením znaménka minus k tomuto parametru ho explicitně zakážete.strict
Nejpřísnější model plovoucí desetinné čárkyParametr /fp:strict nastaví fp_contract na vypnuto a fenv_access na zapnuto.Předpokládá se parametr /fp:except, který lze zakázat explicitním zadáním parametru /fp:except-.Při použití s parametrem /fp:except- vynutí parametr /fp:strict striktní sémantiku plovoucí desetinné čárky, ale bez ohledu na výjimečné události.
Poznámky
Ve stejné kompilaci lze zadat více parametrů /fp.
Informace o řízení chování plovoucí desetinné čárky pomocí funkce naleznete v tématu o pragmatu float_control.Tím se přepíše nastavení /fp kompilátoru.Podle osvědčené technické praxe doporučujeme uložit a obnovit místní chování výpočtů s plovoucí desetinnou čárkou:
#pragma float_control(precise, on, push)
// Code that uses /fp:precise mode
#pragma float_control(pop)
Většina optimalizací plovoucí desetinné čárky souvisejících s parametry /fp:strict, /fp:except (a jejich odpovídajících pragmat) a pragmatem fp_contract je závislá na počítači.Parametry /fp:strict a /fp:except nejsou kompatibilní s parametrem /clr.
Parametr /fp:precise by měl řešit většinu požadavků aplikace na plovoucí desetinnou čárku.Můžete použít parametry /fp:except a /fp:strict, může ale dojít k určitému snížení výkonu.Je-li největší důraz kladen na výkon, zvažte použití parametru /fp:fast.
Parametry /fp:strict, /fp:fast a /fp:precise jsou režimy přesnosti (správnosti).Současně může být aktivní pouze jeden.Při zadání obou parametrů /fp:strict a /fp:precise použije kompilátoru ten, který je zpracován jako poslední.Nelze zadat jak parametr /fp:strict, tak /fp:fast.
Další informace naleznete v tématu Optimalizace plovoucí desetinné čárky v jazyce Microsoft Visual C++.
Nastavení tohoto parametru kompilátoru ve vývojovém prostředí Visual Studio
Otevřete dialogové okno Stránky vlastností svého projektu.Podrobnosti naleznete v tématu Postupy: Otevření stránek vlastností projektu.
Rozbalte uzel Vlastnosti konfigurace.
Rozbalte uzel C/C++.
Vyberte stránku vlastností Vytváření kódu.
Upravte vlastnost Model plovoucí desetinné čárky.
Programové nastavení tohoto parametru kompilátoru
- Další informace naleznete v tématu floatingPointModel.
Viz také
Referenční dokumentace
Nastavení možností kompilátoru
Další zdroje
Optimalizace plovoucí desetinné čárky v jazyce Microsoft Visual C++