Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Winkelfuntionen machen Zicken (https://www.delphipraxis.net/58383-winkelfuntionen-machen-zicken.html)

pseudo-nym 6. Dez 2005 12:19


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:
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;
Hilfe!

Klaus01 6. Dez 2005 12:37

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

shmia 6. Dez 2005 12:42

Re: Winkelfuntionen machen Zicken
 
Dann solltest du mit der höchsten Genauigkeit rechnen und nur den Datentyp Extended verwenden.
Delphi-Quellcode:
var Ergebnis : Extended; // Double ist zu ungenau für einen Taschenrechner
Ausserdem solltest du Wandlungen von Integer -> Float vermeiden.
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);

Klaus01 6. Dez 2005 12:43

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

pseudo-nym 6. Dez 2005 12:51

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:

Ausserdem solltest du Wandlungen von Integer -> Float vermeiden.
Ich habe Wert1 und Wert2 als Extended definiert, aber was nehme ich anstatt FloatToStr, wenn ich in Extended umwandeln will (, oder wandle ich dann in Extended um)?

tigerman33 6. Dez 2005 13:16

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;

pseudo-nym 6. Dez 2005 13:31

Re: Winkelfuntionen machen Zicken
 
Ja, das haut hin.

Dankeschön


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz