Pravdivost pri vylouceni NaN a -NaN.
x == (int)(float) x
Obecne ne. Int je typicky 32 bit, float je 32 bit a obsahuje znamenka a exponent, jak to stoji v clanku. Napr. INT_MAX neprojde, jsou to binarne jenom jednicky az na prvni bit a to se do floatu nevleze.
Ano pro architektury se sizeof(int) <=2, jako treba stare 16 bity.
x == (int)(double) x
Ano, mantisa ma u doublu 52 bit, tam se int vleze.
f == (float)(double) f
Ano, jde jenom o rozsireni typu.
d == (float) d
Ne, 64 bitovy typ se do 32 bit nevleze. Volme treba INT_MAX z prvniho prikladu.
f == -(-f);
Ano, znamenka jsou ulozena samostatne.
2/3 == 2/3.0
Ne, celociselne deleni neni rovno deleni floatu: 0 != 0.66666.
d < 0.0 ((d*2) < 0.0)
Ano, double a floaty by meli pretict do nekonecna.
d > f -f > -d
Ano, kdyz to tedy neni chytak, tak floaty a doubly jsou symetricke kolem 0 diky znamenku.
d * d >= 0.0
Ano, znamenko se pocita jako xor znamenek. Vyjimkou by byl NaN, ale ty jsou vylouceny.
(d+f)-d == f
Ne, treba kdyz d+f je prilis velke a je z toho nekonecno , pak nekonecno minus cislo bude vzdy nekonecno. Neplati treba f=FLT_MAX, d=DBL_MAX.
Velmi dobrá otázka :-) Co vím, tak navíc nebudou platit ty dvě podmínky, které počítají s tím, že nula má znaménko. To se u -ffast-math ignoruje (nebo přesněji řečeno ignorovalo). Ale je docela dobře možné, že přestane platit ještě něco dalšího (na nekonečna jsme se neptali, ale možná ani nebude platit podmínka výpočtů pro Inf-Inf, Inf/Inf atd.)