ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > Aztec & sqrt() | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
30.11.2006, 20:16 Uhr uho Posts: 114 Nutzer |
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 [ - Antworten - Zitieren - Direktlink - ] |
30.11.2006, 22:42 Uhr thomas Posts: 7718 Nutzer |
@uho:Zitat: 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/ [ - Antworten - Zitieren - Direktlink - ] |
01.12.2006, 14:09 Uhr Solar Posts: 3680 Nutzer |
Zitat: 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. [ - Antworten - Zitieren - Direktlink - ] |
01.12.2006, 14:25 Uhr Solar Posts: 3680 Nutzer |
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. ;-) [ - Antworten - Zitieren - Direktlink - ] |
01.12.2006, 15:58 Uhr Holger Posts: 8116 Nutzer |
Zitat: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. [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > Aztec & sqrt() | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |