flyttal enligt IEEE 754. Hur får man så stora värden?

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Rocky_AL
Inlägg: 617
Blev medlem: 7 december 2006, 15:14:50
Ort: Stockholm

flyttal enligt IEEE 754. Hur får man så stora värden?

Inlägg 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?
rehnmaak
Inlägg: 2204
Blev medlem: 13 december 2005, 01:43:41

Inlägg 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.
Rocky_AL
Inlägg: 617
Blev medlem: 7 december 2006, 15:14:50
Ort: Stockholm

Inlägg av Rocky_AL »

läste det där och fattade inget.
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Inlägg 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.
Rocky_AL
Inlägg: 617
Blev medlem: 7 december 2006, 15:14:50
Ort: Stockholm

Inlägg 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.
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Inlägg 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.
rehnmaak
Inlägg: 2204
Blev medlem: 13 december 2005, 01:43:41

Inlägg av rehnmaak »

5/4 * 2^2 = 5

Dvs dividera ditt tal x med 2^n så att det blir i intervallet 0 - 2.
Rocky_AL
Inlägg: 617
Blev medlem: 7 december 2006, 15:14:50
Ort: Stockholm

Inlägg 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.
rehnmaak
Inlägg: 2204
Blev medlem: 13 december 2005, 01:43:41

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Rocky_AL
Inlägg: 617
Blev medlem: 7 december 2006, 15:14:50
Ort: Stockholm

Inlägg 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.
rehnmaak
Inlägg: 2204
Blev medlem: 13 december 2005, 01:43:41

Inlägg 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.
Rocky_AL
Inlägg: 617
Blev medlem: 7 december 2006, 15:14:50
Ort: Stockholm

Inlägg 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?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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.
Rocky_AL
Inlägg: 617
Blev medlem: 7 december 2006, 15:14:50
Ort: Stockholm

Inlägg 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)
Skriv svar