![]() |
Winkelfuntionen machen Zicken
Da das mein erster Beitrag ist erstmal:
Hallo Hab sonst immer nur gelesen, aber jetzt ein Problem das dringend einer Lösung bedürfte. Und Zwar hab ich bei meinem Taschenrechner Winkelfunktionen eigebaut, die eigentlich ganz gut gehen wenn nicht bei Nullstellen Werte wie -5,42101086242752E-20 rauskommen würden. Hab da programmiert:
Delphi-Quellcode:
Hilfe!
procedure TRechenprogramm.ButtonSinClick(Sender: TObject);
begin Vorbereiten(EditEin1.Text, EditEin2.Text); if RButtonArgument1.Checked=true then begin Ergebnis:=Sin(Pi*Wert1/180); EditAus1.Text:=FloatToStr(Ergebnis); EditEin2.Text:=FloatToStr(0); end; if RButtonArgument2.Checked=true then begin Ergebnis:=Sin(DegToRad(Wert2)); EditAus1.Text:=FloatToStr(Ergebnis); EditEin1.Text:=FloatToStr(0); end; end; |
Re: Winkelfuntionen machen Zicken
Hallo,
da 5,42101086242752 E-20 ja schon recht nahe bei null liegt, gehe ich mal davon aus, das es sich hier um ein Rundungsproblem handelt. RealTypen haben halt nur eine Größe von 8 Byte und damit lassen sich halt realeZahlen nicht unendlich genau abbbilden. Daraus resultieren dann diese Rundungsfehler. Vielleicht solltest Du mit round arbeiten, dort kannst Du definieren wie genau das Ergebnis sein sein soll. Grüße Klaus |
Re: Winkelfuntionen machen Zicken
Dann solltest du mit der höchsten Genauigkeit rechnen und nur den Datentyp Extended verwenden.
Delphi-Quellcode:
Ausserdem solltest du Wandlungen von Integer -> Float vermeiden.
var Ergebnis : Extended; // Double ist zu ungenau für einen Taschenrechner
Delphi-Quellcode:
// mit dem Wert 180.0 macht man dem Compiler unmissverständlich klar,
// dass mit Floats gerechnet werden soll Ergebnis:=Sin(Pi*Wert1/180.0); |
Re: Winkelfuntionen machen Zicken
huups, mit round geht das natürlich nicht, dann hättest Du ja einen Integer Wert.
In Delphi 6 gibt es eine Function SimpleRoundTo -> Expression Value SimpleRoundTo(1234567, 3) 1234000 SimpleRoundTo(1.234, -2) 1.23 SimpleRoundTo(1.235, -2) 1.24 SimpleRoundTo(-1.235, -2) -1.23 Die könnte Dir vielleicht helfen. Grüße Klaus |
Re: Winkelfuntionen machen Zicken
Danke für die schnellen Antworten
Aber wenn ich Sin(Pi*Wert1/180.0) hernehme kommt immer noch 5,42101086242752 E-20 raus Zitat:
|
Re: Winkelfuntionen machen Zicken
Du wirst mit reals im Computer nie Null darstellen können, deswegen sollte eine direkte Gleichheitsprüfung mit Null auch i.A. vermieden werden.
Stattdessen benutzt man einen Epsilon-Mechanismus, d.h. man definiert sich ein (sehr, sehr kleines) Epsilon, und prüft dann ob der Wert den man betrachtet näher an Null liegt als dieses Epsilon. Das bedeutet auf gut Deutsch: Alle positiven Werte, die kleiner als Epsilon sind bzw alle negativen Werte, die größer als Epsilon sind werden als Null behandelt.
Delphi-Quellcode:
function RealIsZero(const X: extended): boolean;
const Epsilon = 1e-19 // nur als Beispiel begin Result := abs(x) < Epsilon; end; |
Re: Winkelfuntionen machen Zicken
Ja, das haut hin.
Dankeschön |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz