amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > Aztec & sqrt() [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2006-11-30, 20:16 h

uho
Posts: 114
User
Hallo,

hier wieder eine Frage aus der Rubrik ">10 Jahre alt und ohne Lösung":

Die Funktion double sqrt(double) scheint beim Aztec-Compiler
fehlerhaft zu sein.
Mit folgendem Listing...


code:
#include <exec/types.h>
#include <math.h>

main()
{
 float x=4, y=0;

 y=sqrt(x);

 printf("Wurzel(x) = %fn", y);
}


...bekommt man folgendes Ergebnis:

680564693277057719630000000000000000000.000000

mit double statt float in der Deklaration folgenes:

179769313486231570850000000000000000000000000000000000000000000000...
...000000000000000000000000000000000000000000000000000000000000000...
...000000000000000000000000000000000000000000000000000000000000000...
...000000000000000000000000000000000000000000000000000000000000000...
...000000000000000000000000000000000000000000000000000000.000000

Dabei ist es egal, ob %f oder %lf bei printf() angegeben wird.

Ich nehme an, daß das sqrt() fehlerhaft implementiert ist, da ich so
ziemlich jede Kombination von Fließkommatypen und Ausgabewerten
getestet habe.
Aber vielleicht hat ja noch jemand eine Idee ?

Zwischenzeitlich habe ich mir mit pow() geholfen und mir zunutze gemacht,
daß sqrt(x)==pow(x, 0.5) ist.
Aufgrund der allgemeineren Auslegung von pow() vermute ich allerdings
eine langsamere Arbeitsweise...

Bei der Gelegenheit ist mir noch aufgefallen, daß pow() ebenfalls
fehlerhaft arbeitet, wenn ich math.h nicht inkludiere.
Dort steht allerdings nur

double pow(double, double);

Also nur ein Prototyp.
Wie kann es sein, daß eine Funktion ohne diesen fehlerhaft arbeitet.
Der Compiler beschwert sich jedenfalls nicht und ich verwende
Prototypen i.a. auch kaum - selbstverständlich (?) ohne Funktionsfehler.
Wie kann das sein ?


Anmerken möchte ich noch, das dieses Simpel-Prog mehr als 12000 Zeichen
groß wird - abartig / Winshit-verdächtig ;-((

Eine Antwort waren diese (und andere) Fragen den Entwicklern damals auch
nicht wert - war wohl bei "nur" 400 Märkern nicht einkalkuliert...
Und da frag(t)en sich die Leute, warum es für den Amiga vergleichsweise
wenig Software gibt/gab.



Gruß

uho

[ - Answer - Quote - Direct link - ]

2006-11-30, 22:42 h

thomas
Posts: 7721
User
@uho:
Zitat:
Bei der Gelegenheit ist mir noch aufgefallen, daß pow() ebenfalls
fehlerhaft arbeitet, wenn ich math.h nicht inkludiere.
Dort steht allerdings nur

double pow(double, double);

Also nur ein Prototyp.
Wie kann es sein, daß eine Funktion ohne diesen fehlerhaft arbeitet.
Der Compiler beschwert sich jedenfalls nicht und ich verwende
Prototypen i.a. auch kaum - selbstverständlich (?) ohne Funktionsfehler.
Wie kann das sein ?



Wenn du keinen Prototyp angibst, nimmt der Compiler automatisch

int funktion (int, ...)

an. D.h. alle Parameter werden in int (hier 32 bit integer) umgewandelt und das Ergebnis ist auch int. Da die Funktion aber nichts davon weiß, holt sie zwei doubles vom Stack und gibt ein double zurück. D.h. zum einen erzeugst du einen Stapelüberlauf und zum anderen benutzt du nur die Hälfte des Ergebnisses und das auch noch falsch.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Answer - Quote - Direct link - ]

2006-12-01, 14:09 h

Solar
Posts: 3680
User
Zitat:
Original von uho:

Anmerken möchte ich noch, das dieses Simpel-Prog mehr als 12000 Zeichen groß wird - abartig / Winshit-verdächtig ;-((


Linker - vor allem alte Linker - arbeiten i.d.R. auf der Basis von Übersetzungseinheiten (Objektdateien). Das heißt, wenn in einer Objektdatei mehr als nur die Implementierung von sqrt() enthalten war, dann wird der Linker die ganze Objektdatei einlinken, ob du den Rest nun brauchst oder nicht.

Der Bibliotheksbauer mag sich gedacht haben, daß die alleinige Verwendung von sqrt() relativ selten vorkommt, und die Funktion mit einigen der "üblichen Verdächtigen" zusammengepackt haben. Oder er war faul und hat einfach alle Mathe-Funktionen zusammengepackt...

Alles keine wirklich guten Ausreden, aber Gründe. I-)

[ - Answer - Quote - Direct link - ]

2006-12-01, 14:25 h

Solar
Posts: 3680
User
Ich habe gerade mal nachgeschaut auf der Solaris-8-Kiste hier. In der Link-Bibliothek libm.a finden sich sqrt.o (1012 Byte), sqrtf.o (976 Byte) und sqrtl.o (4448 Byte). Dazu kommt Code zum Packen / Entpacken der Fließkommazahlen (wenn es Code ist, der ohne FPU laufen soll), <errno.h>, verschiedene Hilfsfunktionen (für NaN, INF etc.)... 12k sind schnell beisammen. Der Vorteil ist, daß auch ein größeres mathematisches Programm dann nicht mehr signifikant mehr Code einbindet.

Ganz davon ab sollte man schon korrektes Verhalten erwarten, zumindest wenn man die korrekten Prototypen einbindet. ;-)

[ - Answer - Quote - Direct link - ]

2006-12-01, 15:58 h

Holger
Posts: 8116
User
Zitat:
Original von Solar:
Ganz davon ab sollte man schon korrektes Verhalten erwarten, zumindest wenn man die korrekten Prototypen einbindet. ;-)

Nach zehn Jahren braucht man sich aber über solche Art Fehler dann auch nicht mehr aufregen. Zumals es auch gut sein kann, dass es schon vor zehn Jahren eine triviale Lösung für das Problem gab, die Art der Fragestellung (wenn sie dem heutigen Posting ähnlich war) aber zu keiner entsprechenden Antwort geführt hat.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > Aztec & sqrt() [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2025 by amiga-news.de - all rights reserved.
.