21 May 96 14:15:53, <Christian Clemens> to <Horst Kraemer>:
>> Um Dein Problem zu loesen, muesstest Du unter Ausnutzung der Periodizitaet
>> von SIN und COS solche Werte vermeiden. Wenn Du Deine konkrete Anwendung
>> vorstellst, koennte man Dir vielleicht helfen.
> Nun mein konkretes Problem ist folgendes:
> Ich schreibe mit einem Freund zusammen ein Funktionszeichenprogramm. Bei
> Eingabe der Funktion SIN(1/X) und für sehr kleine X nahe Null bekomme
> ich
> einen Gleitkommafehler.
> Weißt du eine Lösung?
Leider nein. Es gibt keine Loesung, die mit den von TP zur Verfuegung gestellten Datentypen und Standardfunktionen mit vertretbarem Aufwand zu realisieren waere und ich sehe auch ehrlich gesagt nicht, warum man fuer solch ein Mini-Problem eine Loesung suchen sollte.
sin(x) ist nur innerhalb gewisser Grenzen berechenbar. Diese Grenzen sind durch die Mantissenlaege des verwendeten Fliesskomma-Datentyps vorgegeben. Dasselbe gilt fuer exp(x). Auch f(x)=x^n crasht irgendwann. Dies sind halt Grenzen der Standard-Programmiersprachen, die man nur mit unverhaeltnismaessig grossem Aufwand ausweiten kann. Du musst halt Input, von dem Du weisst, dass er einen RTE produzieren wird, abfangen und dies dem Benutzer zurueckmelden.
Da Du allerdings schlecht vor _jeder_ Copro-Berechnung ueberpruefen kannst, ob die Berechung einen RTE produzieren _wird_, ist das Abfangproblem nur dadurch _sicher_ zu loesen, dass Du die Coprozessor-Exceptions ausmaskierst (und damit die Fliesskomma- Fehlerbehandlung von TP aushebelst) und nach jeder Copro-Berechung persoenlich den Copro-Status ueberpruefst - oder ein C++-aehnliches Exception-Handling bastelst (Stichwort: ON ERROR GOTO), mittels dessen Du nach einem Fliesskomma-RTE wieder in Deine Anwendung zurueckkehren kannst. Numerik ist halt tueckisch.
Aber ein so professionelles Programm willst Du vielleicht gar nicht schreiben...
cu
Horst
CC> Nun mein konkretes Problem ist folgendes:
CC> Ich schreibe mit einem Freund zusammen ein
CC> Funktionszeichenprogramm. Bei Eingabe der Funktion SIN(1/X) und
CC> fuer sehr kleine X nahe Null bekomme ich einen Gleitkommafehler.
CC> Weisst du eine Loesung?
Dafuer gibt es keine Loesung, da die Funktion 1/x im Punkt x=0 nicht berechenbar ist. Du kannst also keinen Funktionswert berechnen, weil es keinen gibt.
Das von Sven.
> e-mail: SLetzel @ aol.com
22 May 96 07:03:13, <Peter Schuette> to <Horst Kraemer>:
> HK> Schaetze mal ab,
> HK> wie gross x^n wird, bis ein Summand x^n/n! kleiner als 1E-5 wird. Mit
> HK> TP-Datentypen laesst sich nichts Vernuenftiges mehr berechnen, da die
> HK> Nachkommastellen mangels Ziffernlaenge verlorengehen.
> Hm, WENN man es dann unbedingt brauchst, muesste man sich fuer die
> Zahlen auch noch was "vernuenftiges" einfallen lassen.
Das Problem ist doch nur die Berechnung von x mod 2pi fuer grosse x. Wenn Du die Zahlen in einem ueberlangen Format darstellst, brauchst Du damit ja nur (!) den Wert
x' = x mod 2pi = 2pi * FRAC (x/2pi)
zu ermitteln. Dessen Sinus berechnest Du normal mit TP.
cu
Horst
Am 21.05.96 schrieb _Christian Clemens_ an _Horst Kraemer_
die folgenden bemerkenswerten Zeilen:
> Landshut, den 21.05.96
>
> Hallo Horst,
>
> > Um Dein Problem zu loesen, muesstest Du unter Ausnutzung der Periodizitaet
> > von SIN und COS solche Werte vermeiden. Wenn Du Deine konkrete Anwendung
> > vorstellst, koennte man Dir vielleicht helfen.
>
> Nun mein konkretes Problem ist folgendes:
>
> Ich schreibe mit einem Freund zusammen ein Funktionszeichenprogramm. Bei
> Eingabe der Funktion SIN(1/X) und für sehr kleine X nahe Null bekomme ich
> einen Gleitkommafehler.
Hi Christian.
Wer hat Dich denn auf dieses Problem gehetzt ?
Ein Mathe-Lehrer, der sich einen kleinen Scherz mit Dir machen wollte ?
Der sin(1/x) ist fuer x=0 unbestimmbar. Der Grenzuebergang von sehr
kleinen Werten nach Null fuehrt in der Naehe von Null zu heftigen
Schwankungen im Fkt-Wert. Das ist prinzipiell begruendet, und liegt
daran, dass 1/x in der Umgebung von Null auf beliebig hohe Werte
anwaechst.
Mit ein wenig Ueberlegung kannst Du folgendes nachweisen:
Zwischen jeder beliebig nahe an x=0 liegenden Position X1 auf der
X-Achse gibt es noch _unendlich_ viele Vorzeichenwechsel von
sin(1/x) zwischen X1 und X=0.
Auch eine Erhoehung der Rechengenauigkeit auf 50 oder 100 Stellen
bringt Dir keine genaueren Erkenntnisse ueber den Fkt-Wert von Null.
Der ist halt irgendwo zwischen -1 und 1 "verschmiert". Mehr laesst
sich dazu nicht sagen.
Ciao,
Harald
CC> Ich schreibe mit einem Freund zusammen ein Funktionszeichenprogramm.
CC> Bei Eingabe der Funktion SIN(1/X) und fuer sehr kleine X nahe Null
CC> bekomme ich einen Gleitkommafehler.
Vermeiden, eigentlich ganz einfach.
Du musst also vorher auf bestimmte Integritaesbedingungen testen und dann
Werte ausschliessen. sin(1/x) liefert natuerlich auch fuer x gegen 0 kein
so tolles Bild mehr, als das man das nicht tolerieren koennte.
kiek mol wedder in
__ _
\ \_ t...@labris.hades.cls.de
public-key via EB