amiga-news 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:
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/

[ - Antworten - Zitieren - Direktlink - ]

01.12.2006, 14:09 Uhr

Solar
Posts: 3680
Nutzer
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-)

[ - 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:
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.

[ - 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.
.