Citat:
Ursprungligen postat av
LoveShy
Det borde inte vara svårt att fixa bitvis (sen om det är bästa sättet är en annan sak). Kolla om alla bitar utom sign är 0, isåfall sätt sign till 0, sen kör som vanligt.
Förutsatt att systemet verkligen använder IEEE 754, vilket är det absolut vanligaste, skulle man kunna göra så här och slippa veta eller ta reda på endianness för att hitta signed-biten:
Kod:
double n;
...
/* normalisera noll */
if (n == 0.0) memset(&n, 0, sizeof n);
Men det löser som sagt inte problemet med att flyttal har begränsad upplösning.
https://stackoverflow.com/a/2100502 verkar förklara det ganska bra, och ett tillägg är att standarden dessutom godkänner
fem olika avrundningsregler för att fungera med alla processorer. Alla avrundar till något av de två värden som är närmast det exakta, men skiljer sig åt i hur de gör det. Tänk dig en decimal flyttalstyp med 8 siffor, där 1/3 kan bli antingen 0.33333333 eller 0.33333334.
Heltal är inga problem med +, -, * och /, så länge man inte överflödar. 81.0 / 9.0 är alltid 9.0. Men då kan man ju lika gärna använda en heltalstyp. Andra operationer, som innefattar algoritmer och oändlighet, ska man nog inte lita alltför mycket på, åtminstone om man ska tro
https://stackoverflow.com/a/26071783/1246115.