- Fliesskommazahlen:
- Allgemein:
x = (+/-1) Mantisse * BasisExponent
Üblicherweise ist die Basis = 2, manche Taschenrechner
benutzen auch 10.
- Darstellung im Speicher (z.B. 64-Bit = double):
Die Zahl
Pi = 1.1001001000011111101101010100010001... * 21
wird im IEEE-Standard als
SEEEEEEEEEEEMMMM....
0100000000001001001000011111101101010100010001000010110100011000
abgespeichert. Nach dem Vorzeichenbit (S) folgen 11 Bits
fuer den Exponenten (E) und 52 Bits fuer die Mantisse
(M).
Man beachte den bias (210-1 = 1023) im Exponenten und
die abgeschnittene führende 1 in der Mantisse.
ieeebit.c |
numbers.c
- Maschinengenauigkeit, Runden, Under-/Overflow
Mit ein paar Tricks läßt sich prüfen, welche
Basis zur Zahlendarstellung benutzt wird, ob bei Addition
zweier Zahlen gerundet oder abgeschnitten wird, wie Unter- bzw.
Überlauf funktionieren etc.
machar.c
[NR] |
machar.c
[Netlib] |
over.c |
limit.c
- Summation / Kleine Differenzen:
- exp(-x) für großes x:
Summiert man die Reihenentwicklung direkt, treten
Differenzen großer Zahlen auf. Es ist günstiger,
statt dessen 1.0/exp(x) zu berechnen.
exp-both.c
- (1-cos x)/x2 für kleines x:
Erneut tritt die Differenz nahezu gleicher Zahlen auf.
Es ist günstiger, statt dessen 1/2 [sin(x/2) / (x/2)]2
zu berechnen
cancel.c
- Summiere 1/k2 über k = 1 ... Unendlich:
Es empfiehlt sich, die Summation mit den kleinsten Termen zu
beginnen. Ein weiterer Trick ist 'kompensierte Summation': Man
versucht den Fehler in s = a + b mittels
tmp = a + b
err = (tmp - a) - b
s = tmp - err
zu kompensieren.
sumord.c
|