Sida 1 av 2
flyttal enligt IEEE 754. Hur får man så stora värden?
Postat: 17 februari 2008, 13:29:56
av Rocky_AL
Har börjat experimentera lite med flyttal. Läste lite om IEEE 754 standarden men förstår inte hur de kan ha så hög precition men samtidigt kunna representera så höga värden. Om man tex kollar på en vanlig float (32-bit) så används 8bit till heltalen och sedan 23 till decimalerna och en bit används för att visa om det är negativt eller positivt. På något konstigt sätt kan man alltså representera tal på flera miljoner med en vanlig float, men i mitt huvud borde gränsen gå vid 255 eftersom heltalen representeras med endast 8bit. Hur fungerar detta egentligen?
Postat: 17 februari 2008, 13:52:26
av rehnmaak
De åtta bitarna är väl exponent? Dvs mantissan är ett tal 0-2 * 2 upphöjt till exponenten. Det är visst också någon justering av exponenten med det kan man läsa om
här.
Postat: 17 februari 2008, 13:57:22
av Rocky_AL
läste det där och fattade inget.
Postat: 17 februari 2008, 14:00:02
av Andax
Precis som rehnmaak skriver så ska man tolka de 8 exponentbitarna som 2^exponent där exponent är 8 bitar och "signed", dvs med tecken.
På så vis man representera väldigt små tal (till absolutbeloppet) och väldigt stora tal. 2^-128 är ungefär 10^-38 och 2^127 är ungerfär 10^38.
Postat: 17 februari 2008, 14:05:14
av Rocky_AL
Aha de gör så, men om jag vill ha talet 5.0 då? 2^2=4 och 2^3=8. 5 ligger mellan där, hur representeras alla de tal som hamnar mellan? Antar att det har något med de 23 decimalerna att göra.
Postat: 17 februari 2008, 14:17:53
av Andax
Precis. Det är det som mantissan är till för.
Kommer inte ihåg om mantissan ska tolkas som 0.MMMM.... eller 1.MMMM....
Dvs att man antar att man har ett tal mellan 0 och 1 eller 1 och 2 som man multiplicerar med 2^exponent.
Postat: 17 februari 2008, 14:23:53
av rehnmaak
5/4 * 2^2 = 5
Dvs dividera ditt tal x med 2^n så att det blir i intervallet 0 - 2.
Postat: 17 februari 2008, 14:27:57
av Rocky_AL
hmmm, är inte detta system väldigt kraftkrävande?
Varje gång jag vill spara ett värde i detta format så måste jag dividera med 2^2 tills det ligger i intervallet.
Postat: 17 februari 2008, 14:42:55
av rehnmaak
Just det! Det är därför man ska undvika flyttal så långt det går och istället köra med heltalsaritmetik. Vanligt är ju om man jobbar med tal i intervallet 0-5 så gör man beräkningarna med tal som är multiplicerade med tex 1024 och när man är klar dividerar man resultatet med 1024.
Postat: 17 februari 2008, 14:51:36
av sodjan
Postat: 17 februari 2008, 15:17:22
av Rocky_AL
säg att jag har ett väldigt stort tal och lägga till något, säg 1, då måste hela grejen först vecklas ut genom att multiplicera decimaltalet (0-2) med 2^exponenten. sedan kan man lägga till 1 och sedan dividera med 2^2 tills man är tillbaka där man började. Jättetidskrävande måste jag säga.
Om man ska göra detta i en vanlig 8-bitars PIC så måste man ha något temporärt ställe att spara flyttalet när det inte är sparat i IEEE standarden för att kunna arbeta med det, eller? Detta temporära ställe måste ju vara väldigt stort för att rymma så stora tal.
Postat: 17 februari 2008, 15:30:46
av rehnmaak
Man brukar inte göra riktigt så, utan man gör en normalisering av flyttalen så att mantissorna kan summeras direkt. Problemet om man har ett väldigt stort tal och ska lägga till 1 så gör den begränsade precisionen att resultatet blir oförändrat.
Samma sak gäller om man har ett väldigt litet tal tex 0.00000001 och lägger till 1 så borde resultatet bli 1.00000001 men om man bara har ett begränsat antal decimaler så blir det avrundat till 1.0 istället.
Postat: 17 februari 2008, 15:44:59
av Rocky_AL
Tex om ett tal som har exponenten 2 ska adderas med 1 så lägger man helt enkelt till 1/(2^2)=0.25 till mantissan. Är det så du menar? Ganska smart. Men om talet ska skrivas ut på en display eller dylikt så måste man väl ändå veckla ut det hela eller?
Postat: 17 februari 2008, 16:28:22
av sodjan
Det här är ett icke-problem, erfersom alla miljöer som stöder floating-point
alltid har rutiner i sin runtime för all möjlig hantering.
Vill du bara helt teoretiskt veta hur det fungerar ?
För ingen i dag skriver egan rutiner p.g.a att man måste...
> Jättetidskrävande måste jag säga.
Och ?
Ingen påstår något annat.
Postat: 17 februari 2008, 16:43:03
av Rocky_AL
Jag är mest intereserad av hur det hela fungerar, men också för att kunna programmera program till 8-bitars PICar som hanterar flyttal. Menar du att det går att hålla på med flyttal hur som helst när man programmerar PICar i assembler? (det skulle vara trevligt)