aangezien ik me toch verveel ga ik ook maar even de uitleg typen
een float wordt opgeslagen als 32 bits. 1 bit voor de sign, 8 bits voor de exponent en 23 bits voor de mantissa:
code:
1
2
3
4
5
6
| bit: 31 30 23 22 0
[S ][E7 E0][M22 M0]
S = sign
E = exponent
M = mantissa |
de getallen worden gerepresentateerd in de vorm mantissa * 2
exp, waarbij de mantissa een getal tussen 1 en 2 is en de exponent een geheel getal.
Omdat de exponent zowel positief als negatief kan zijn is ervoor gekozen om het op te slaan als
127 + exponent. Een E van 127 betekent dus 0 en 126 is -1
De mantissa ligt altijd tussen 1 en 2. Omdat het onzin is om die 1 ook op te slaan, wordt alleen het gedeelte achter de komma maar opgeslagen in M. Een mantissa van 1.5 wordt dus opgeslagen als 0x400000 (de totale grootte van de mantissa is 23 bits, oftewel 0x800000 verschillende waardes. 0.5 ligt dan natuurlijk op de helft van 0x800000, vandaar de 0x400000)
En de sign bit is om aan te geven of het positief of negatief is; als ie geset is dan is het getal negatief.
Wat het trucje doet is zorgen dat de integer waarde gewoon in de mantissa komt te staan. Dit kun je doen door 1 * 2
23 bij het getal op te tellen, zodat het getal de waarde krijgt:
1.[integer waarde] * 2
23. (Dit was dus stap 1 van de truc, namelijk n.f += bias.f)
Nu is het gewoon een simpele kwestie van de mantissabits uitlezen. De schrijver van het stukje doet dat door de bits van de bias van de waarde af te trekken. Aangezien de exponenten van beide getallen hetzelfde zijn, levert dit dus precies de mantissa op. Het lijkt mij dat je het ook gewoon kunt and'en met 0x7fffff, dus alle mantissa bits, zodat je alleen de mantissa overhoudt. Waarschijnlijk kiest ie voor aftrekken omdat dat minder bytes aan code oplevert (scheelt maar 2 of 3 bytes ofzo

)
Het nadeel van dit trucje is dat je apart rekening moet gaan houden met negatieve getallen, maar het grootste nadeel is nog wel dat je maar maximaal 23 bits integers uit de floats kan halen... meer kan er tenslotte niet in de mantissa
Ik hoop dat dit verhaaltje een beetje duidelijk was, ik ben meestal nogal slecht in uitleggen

(en dan ga ik nu

)