Harald Sjöztedt
<75>
· Text 5278 · w8 · kommentar
1986-10-22 20:55
Ärende: Flyttal i BASIC II
Flyttalen i BASIC II kodas binärt med exponent och mantissa.
Två moder finns, SINGLE där talet har en byte exponent och
tre byte mantissa samt DOUBLE där talet har en byte exponent
och sju byte mantissa.
Anledningen till de två formaten är att i SINGLE ska beräkningarna
gå något snabbare beroende på sk. benchmarks dvs. jämförelser mellan
olika maskiner. Således är startläget SINGLE.
Formaten DOUBLE och SINGLE är 4 resp 8 byte beroende på Z80:ns
É
é Dessa rader beror på spakfel
ä
register; vid beräkningar används dessa som följer:
Exponentbyte i regsiter A
Mantissa SINGLE i B,C,D
Extrabyte SINGLE i E
Mantissa DOUBLE i B,C,D,E,B',C',D'
Extrabyte DOUBLE i E'
Där extrabyten används för att uppnå ökad noggrannhet.
Exponenten, som är samma i SINGLE och DOUBLE, är en byte och ligger
som Exp + 129 i första byten. Tvåpotenserna kan således hålla sig
mellan -128 och +127 vilket är ungefär 10 Ü -38 -- 10 Ü +38.
Exponenten -129 (0) uttyds som talet 0, oberoende av mantissans
innehåll.
Mantissans 8 byte är ett binärt tal från 1B till 1111...11B. Denna
roteras till dess en etta erhålls i den mest värda biten, dvs.
normal exponentform uppnåtts. Denna etta (Högsta biten i mantissans
första byte) anger talets tecken då talet är lagrat. Vid beräkningar
uppskattas normalt resultatets tecken från början.
I DOUBLE är noggranheten 56 binära positioner vilket motsvarar 16
decimala. I SINGLE är det 24 respektive 7.
BinPos * log10(2) = DecPos
Extremtalen är således:
1.1111111111111111111111111111111111111111111111111111111 * 2 Ü 127
samt
- ---- "" ---- * 2 Ü -128
Detta är 1.701411834604692 * 10 Ü +38
resp -5.877471754111437 * 10 Ü -39
På grund av någon bugg i ASCI2F kan inte det senare talet matas in
utan felkod 130 erhålls (för STORT (?) flyttal) men talen kan fås
på följande vis:
double : ; cvt¤F(chr¤(-1,127,-1,-1,-1,-1,-1,-1))
cvt¤f(chr¤( 1, -1,-1,-1,-1,-1,-1,-1))
Flyttalsrutinerna är väl skrivna helt enligt kokboken Computer
approximations. Nämnas kan de LD H,B instruktioner som på vissa
ställen finns instoppade. Dessa är troligen där för att visa varifrån
koden härstammar.
Den förbättring man eventuellt skulle vilja ha är 16 bits exponent,
men en sådan sak är svår att genomför med register i en Z80.
Om detta infördes skulle tal upp till 10 Ü 9863 kunna representeras.
(10 ** (32767 * log10(2))).
En idé kanske vore att alltid räkna med talen i minnet (slött) men
då kunna ange X bytes mantissa (för alla x 1 - oändligheten) så kunde
man kasta ut ADD¤ osv.