Autor |
Beitrag |
Melanie
      
Beiträge: 33
|
Verfasst: 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
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(0) then exit; if edit2.Text <= inttostr(0) then exit; Lkdm:=strtofloat(edit1.Text); Radius:=Lkdm/2; Teiler:=strtoint(edit2.Text); Grad:=Kreis/Teiler;
setlength (a,Teiler); for i:=Low(a) to High(a) do a[i]:=i*grad; setlength(sinus,teiler); for i:=low(sinus) to high(sinus) do sinus[i]:=sin(pi*a[i]/180)*radius;
with memo1 do begin 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
Moderiert von Peter Lustig: Code- durch Delphi-Tags ersetzt
|
|
Sven
      
Beiträge: 314
D6 Ent, K3 Pro (patched)
|
Verfasst: 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
      
Beiträge: 314
|
Verfasst: Di 23.12.03 09:18
Servus!
@ Sven: sin 90°=1, tan 90°=unendlich
Gruß,
Adrian
|
|
Uli Schoch
      
Beiträge: 81
|
Verfasst: 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 
      
Beiträge: 33
|
Verfasst: 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 
      
Beiträge: 33
|
Verfasst: 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 
|
|
Uli Schoch
      
Beiträge: 81
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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 
      
Beiträge: 33
|
Verfasst: 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
      
Beiträge: 81
|
Verfasst: Di 23.12.03 13:01
Nochmals Hallo Melly
Schreib mal die folgenden 3 Zeilen in deinen Code:
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 Peter Lustig: Delphi-Tags hinzugefügt
|
|
Adrian
      
Beiträge: 314
|
Verfasst: 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 
      
Beiträge: 33
|
Verfasst: 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 
|
|
Uli Schoch
      
Beiträge: 81
|
Verfasst: Di 23.12.03 18:38
Hallo Melly
Statt:
Delphi-Quelltext 1:
| lines.Add(floattostr(a[i])+'°' +' X-Achse '+floattostr(sinus[i])); |
Schreibe
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 Peter Lustig: Code- durch Delphi-Tags ersetzt
|
|
|