Autor Beitrag
Melanie
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Mo 22.12.03 22:42 
Hallo ,ich schreibe gerade ein Programm mit dem Lochkreiskoordinaten
berechnet werden können .Aber irgendwo in der Berechnung ist ein Fehler,
der einen unsinnigen Wert ausgibt , wenn sich eine Bohrung auf genau
180 Grad befindet.
Alle anderen Werte stimmen





ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
procedure TForm1.BitBtn1Click(Sender: TObject);

    var                   a : array of double; sinus:array of double;
     radius, Lkdm,Grad: double;
                     Teiler,i: integer;
      const         Kreis : integer =360;


begin

     if edit1.Text <= inttostr(0then exit;      //Eingabe abfrage
        if edit2.Text <= inttostr(0then exit;   //Eingabe abfrage
         Lkdm:=strtofloat(edit1.Text);             //Lochkreis einlesen
            Radius:=Lkdm/2;                           //Radius errechnen
             Teiler:=strtoint(edit2.Text);        //Bohrungsanzahl einlesen
                Grad:=Kreis/Teiler;               //Winkel bestimmen




             setlength (a,Teiler);                 //Dynamisches Array festlegen  
               for i:=Low(a) to High(a)          //Bohrungswinkel festlegen
                 do  a[i]:=i*grad;
                   setlength(sinus,teiler);
                     for i:=low(sinus) to high(sinus)
                       do  sinus[i]:=sin(pi*a[i]/180)*radius; //Umrechnen Sinus    
                                                                              //von Rad in Grad




       with memo1 do begin    //Ausgabe in Memofeld
        clear;
          scrollbars:=ssboth;
            Lines[0]:='';
               for i:=0 to Teiler -1 do
                 lines.Add(floattostr(a[i])+'°' +' X-Achse '+floattostr(sinus[i]));
end;
  end;

Vieleicht kann mir da jemand weiterhelfen


MfG Melly :cry:

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt
Sven
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 314


D6 Ent, K3 Pro (patched)
BeitragVerfasst: Di 23.12.03 09:08 
Die "unsinnigen" Werte die du bekommst sind unendlich Groß. Sin(90) ist unendlich.

_________________
MDK 9.1, Kernel 2.4.21, KDE 3.1 Kylix 3 Pro (patched), nutze aber auch Windows
Adrian
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 314



BeitragVerfasst: Di 23.12.03 09:18 
Servus!

@ Sven: sin 90°=1, tan 90°=unendlich

Gruß,

Adrian
Uli Schoch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81



BeitragVerfasst: Di 23.12.03 11:00 
Hallo Melanie
Ich habs schnell ausprobiert, bei 180 Grad (mit Edit1=2 und Edit2=20) gibts bei mir einen Wert von 1.62630325872826E-19. Da der Sinus von 180 Grad 0 ist, ist das Resultat fast korrekt, beim Berechnen des Sinus gehts halt nicht genau auf. Runde dein Resultat auf soviele Stelle wie du brauchst, dann klappts sicher

Gruss
Uli
Melanie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Di 23.12.03 11:01 
Hallo ihr zwei, daß der Sinus von 0°=0 , 90°=1 , 180°=0 , 270°=-1 ist mir auch bekannt ,nur war das nicht die Frage.
In dem Programm ist irgend ein Fehler der nur auftritt wenn eine Bohrung
genau auf 180° liegt.Liegt die Bohrung nur 0,000000001° von der Achse weg rechnet das Programm wieder richtig.

MfG Melly :?
Melanie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Di 23.12.03 11:25 
Hallo Uli,ich kann doch die Gesetze der Mathematik nicht verbiegen.
Jeder Taschenrechner sagt sin von 180°=0 und zwar ohne
Kommastellen.
Auch Delphi ist der Meinung wenn ich den Sinus normal berechne,
Nur in meinem Programm ist das nicht der Fall.Ergo, ist da ein Fehler drin
und ich finde ihn nicht.


Formel Für Koordinaten[
sin (alpha) =G/h G=sin (alpha)*H
cos( alpha) =A/H A:=cos(alpha)*H

H= Radius


MfG Melly :cry:
Uli Schoch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81



BeitragVerfasst: Di 23.12.03 12:29 
Hallo Melly
Meinen Wert von 1.62630325872826E-19 habe ich mit d e i n e m Code bekommen!! Einzige Änderung: Statisches statt dynamisches Array.
Was bekommst du denn für einen "unsinnigen" Wert?

Gruss
Uli
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 23.12.03 12:41 
Hallo!

Ich denke, dass Uli schon recht hat. Wenn der Wert im Bereich von 10^(-19) liegt, wird das ein Rundungsfehler sein. Das kommt vor. Schau Dir mal den Weg an:

exakt gegeben: Kreis, Teiler
mit Ungenauigkeit behaftet: Grad = Kreis/Teiler (nicht alle Nachkommastellen werden mitgenommen)

mit Ungenauigkeit behaftet: a[i] = grad * i (da "grad" ungenau ist und die Ungenauigkeit durch die Multiplikation mit i vergrößert wird)

ungenau: sinus[i]:=sin(pi*a[i]/180)*radius; (wieder 'ne Menge Rechenoperationen, und wenn der Sin als Reihe berechnet wird, dann wird's ganz übel.)

MfG
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Melanie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Di 23.12.03 13:00 
Hallo Uli bei einem Lochkreis von 500 mm und 6 Bohrungen bekomme ich fogende Werte

0° X-Achse =0
60° X-Achse =216,50635094611
120° X-Achse =216,50635094611
180° X-Achse =3,06151588455594E-14
240° X-Achse =-216,50635094611
300° X-Achse =-216,50635094611

Bei 180° liegt der Fehler da müßte 0 stehen.alle andern Werte sind 100%ig
richtig.

Bei Formel G=sin(alpha)*H

in Zahlen sin(a)von 180°= 0 0*Radius (250)=0


Hier ein Logausschnitt Durchmesser 500 1000 Bohrungen

178,56° X-Achse =6,28252386083434
178,92° X-Achse =4,712109928852
179,28° X-Achse =3,14150997083821
179,64° X-Achse =1,57078599138978
180° X-Achse =3,06151588455594E-14
180,36° X-Achse =-1,57078599138972
180,72° X-Achse =-3,14150997083815
181,08° X-Achse =-4,71210992885205
181,44° X-Achse =-6,28252386083439
181,8° X-Achse =-7,85268976953211
182,16° X-Achse =-9,42254566748368
182,52° X-Achse =-10,9920295794662
182,88° X-Achse =-12,5610795449424
183,24° X-Achse =-14,129633620506
183,6° X-Achse =-15,6976298823283
183,96° X-Achse =-17,2650064286013
184,32° X-Achse =-18,8317013819832
184,68° X-Achse =-20,3976528920394
185,04° X-Achse =-21,9627991376858
185,4° X-Achse =-23,5270783296286
185,76° X-Achse =-25,0904287128037
186,12° X-Achse =-26,652788568815
186,48° X-Achse =-28,2140962183704
186,84° X-Achse =-29,7742900237174

Alles 100%ig bis auf Wert bei genau 180°

MfG Melly
Uli Schoch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81



BeitragVerfasst: Di 23.12.03 13:01 
Nochmals Hallo Melly

Schreib mal die folgenden 3 Zeilen in deinen Code:

ausblenden Delphi-Quelltext
1:
2:
3:
s:=sin(pi);
memo1.lines.Add(floattostr(sin(pi)));
memo1.lines.Add(formatFloat('0.000000000000000000000000',sin(pi)));


Schau mit dem Debugger, was in s (als double deklariert) und im memo1 drin steht. Du wirs dich wundern!!!, ich hab mich auch gewundert!!!

Gruss
Uli

Moderiert von user profile iconPeter Lustig: Delphi-Tags hinzugefügt
Adrian
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 314



BeitragVerfasst: Di 23.12.03 16:01 
Servus!

Melanie, es handelt sich schlicht und eunfach um einen Rundungsfehler. Du kannst mal probehalber sin(45)-cos(45) berechnen lassen, rauskommen müßte 0, es sind aber ca. 5E-20. Genauso ist es bei Deiner Rechnung. Und bedenke, 3E-14 sind anders geschrieben
0,000 000 000 000 03
Ulis Rat mit dem Runden ist schon richtig und mach Dir keine Gedanken übers "Verbiegen" der Mathematik: Mathematik ist ein idealistisches Gedankengebäude, dem wir uns in der realen Welt nur in gewissen Grenzen nähern können.

Gruß,

Adrian
Melanie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Di 23.12.03 18:00 
Hallo ,es stimmt was ihr sagt,ich habe den Sinus von 180 einmal
von Delphi ausrechnen lassen da kommt -5,42101086242752E-20
raus.
Nur wie runde ich in meinem Programm da die Zahlen ja in einer
Schleife errechnet werden?

Gruß Melly :roll:
Uli Schoch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81



BeitragVerfasst: Di 23.12.03 18:38 
Hallo Melly

Statt:
ausblenden Delphi-Quelltext
1:
lines.Add(floattostr(a[i])+'°' +' X-Achse '+floattostr(sinus[i]));					

Schreibe
ausblenden Delphi-Quelltext
1:
lines.Add(floattostr(a[i])+'°' +' X-Achse '+formatFloat('0.0000',(sinus[i]));					

Schau in der Hilfe, was du für Möglichkeiten im FormatFloat hast. Im Beispiel werden 1 Stelle vor und 4 Stellen nach dem Komma gezeigt.

Viel Glück
Uli

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt