AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Winkelfuntionen machen Zicken

Ein Thema von pseudo-nym · begonnen am 6. Dez 2005 · letzter Beitrag vom 6. Dez 2005
Antwort Antwort
pseudo-nym

Registriert seit: 6. Dez 2005
Ort: München
7 Beiträge
 
#1

Winkelfuntionen machen Zicken

  Alt 6. Dez 2005, 12:19
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!
Wer Rasen säht, wird Mäher ernten (!)

MfG pseudo-nym
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Winkelfuntionen machen Zicken

  Alt 6. Dez 2005, 12:37
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
Klaus
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: Winkelfuntionen machen Zicken

  Alt 6. Dez 2005, 12:42
Dann solltest du mit der höchsten Genauigkeit rechnen und nur den Datentyp Extended verwenden.
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);
Andreas
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Winkelfuntionen machen Zicken

  Alt 6. Dez 2005, 12:43
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
Klaus
  Mit Zitat antworten Zitat
pseudo-nym

Registriert seit: 6. Dez 2005
Ort: München
7 Beiträge
 
#5

Re: Winkelfuntionen machen Zicken

  Alt 6. Dez 2005, 12:51
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)?
Wer Rasen säht, wird Mäher ernten (!)

MfG pseudo-nym
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#6

Re: Winkelfuntionen machen Zicken

  Alt 6. Dez 2005, 13:16
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;
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
pseudo-nym

Registriert seit: 6. Dez 2005
Ort: München
7 Beiträge
 
#7

Re: Winkelfuntionen machen Zicken

  Alt 6. Dez 2005, 13:31
Ja, das haut hin.

Dankeschön
Wer Rasen säht, wird Mäher ernten (!)

MfG pseudo-nym
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:37 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