Autor Beitrag
Tilo
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: Di 08.03.05 20:54 
Was Macht mein Prog falsch?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.FormCreate(Sender: TObject);
begin
showmessage(floattostr(cos(pi)));
showmessage(floattostr(cos(pi/2)));
end;


cos(pi/2) müsste 0 ergeben, da Delphi im Bogenmaß rechnet, aber er gibt -2,71050543121376E-20 aus.
Wie kann man den Fehler beheben?
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 08.03.05 21:01 
Hallo!

Das ist kein Fehler. Ein Rechner hat halt nur eine beschränkte Genauigkeit, sodass der Wert nicht exakt Null ist. Du kannst lediglich die Ausgabe so formatieren, dass nur eine begrenzte Zahl an Nachkommastellen angegeben wird. Bei diesem kleinen Wert ergäbe ja sogar eine Ausgabe mit zehn Nachkommastellen sogar nach Null. Siehe dazu den Befehl FloatToStrF in der Delphi-Hilfe.

MfG
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Tilo Threadstarter
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: Mi 09.03.05 10:28 
Gibt es keine Möglichkeit einen anderen Befehl zu verwenden der exakter ist?
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 09.03.05 10:34 
Nein.
Ein bisschen Mathe:
Das was du berechnen willst sind reelle Zahlen. Dein Computer kann aber keine reellen Zahlen. Auch eine Floating-Point-Unit auf deinem Rechner kann das nicht. dadurch wirst du immer eine geringfügige Abweichung bei reellen Zahlen bekommen. Rationale Zahlen sind berechenbar. Alles was darüber hinaus geht, kannst du mit dem heutigen Stand der Technik vergessen.
das Ergebnis deiner Berechnung sagt dir aber, dass die Abweichung aber erst aber der 20sten Stellen nach dem Komma anfängt. Ich denke, dass ist für den normalen Fall genau genug. :wink:
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 09.03.05 10:53 
user profile iconTilo hat folgendes geschrieben:
Gibt es keine Möglichkeit einen anderen Befehl zu verwenden der exakter ist?
Doch, gibt es. Du must "nur" ein Computer-Algebra-System einsetzen/selbst programmieren. Fertige Beispiele hierfür wären Derive oder Maple. Solche Systeme rechnen nicht den cos aus, sondern formen ihn durch mathematische Operationen um. Und der cos von pi/2 ist nunmal 0.

_________________
We are, we were and will not be.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 09.03.05 10:58 
@Gausi:
Das würde mich jetzt doch genauer interessieren. Wenn du meinen Beitrag weiter oben liest, habe ich dann was falsches geschrieben?
Ich kenne diese beiden Systeme nämlich nicht. Und dein "nur" deutet an, dass das ein ziemlich dickes Ding ist.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 09.03.05 11:14 
Deriv ist ein System, was oft im Matheunterricht (Oberstufe) in der Schule drankommt, Maple ist vielfältiger, und kommt eher in der Uni zum Einsatz.
Der Unterschied ist folgender:
cos(x); ruft eine Funktion auf, die den cosinus von x berechnet. Durch irgendwelche mathematische Berechnungen. Das geht nur näherungsweise.

Derive oder Maple "wissen" aber z.B., das der Sinus(0) = 0 ist. Sie "wissen" auch, das sin^2+cos^2 = 1 ist. Diese Systeme können auch Umformungen wie z.B. Ausmultiplizieren, binomische Formeln, Additionstheoreme von Sin und cos, usw.
Ein erster Ansatz dafür sind Parser, aber das geht weit darüber hinaus. Die Dinger können Nullstellen berechnen, Polynomdivision, Integrieren, Differenzieren, Gleichungssysteme lösen. Du kannst z.B. bei Derive etwas angeben wie
(SOLVE(x^4 + 3·x^3 - 2.65·x^2 + x - 2 = 0, x)) und nach 20 Sekunden (uups...) Rechenzeit spuckt er dir das aus:
(x = ‹((‹800213046/115200 - 3225077/13824000)^(1/3) - (‹800213046/115200 + 3225077/13824000)^(1/3) + 241/240) - 3/4 - î·‹(‹(- (13997521·‹800213046/24883200000 - 45143083034117/2985984000000)^(1/3) + (13997521·‹800213046/24883200000 + 45143083034117/2985984000000)^(1/3) + (21924189518329/2985984000000 - 977·‹8719602277256646/12441600000)^(1/3) + (977·‹8719602277256646/12441600000 + 21924189518329/2985984000000)^(1/3) + 951/200) + (‹800213046/115200 - 3225077/13824000)^(1/3) - (‹800213046/115200 + 3225077/13824000)^(1/3) - 241/120) � x = ‹((‹800213046/115200 - 3225077/13824000)^(1/3) - (‹800213046/115200 + 3225077/13824000)^(1/3) + 241/240) - 3/4 + î·‹(‹(- (13997521·‹800213046/24883200000 - 45143083034117/2985984000000)^(1/3) + (13997521·‹800213046/24883200000 + 45143083034117/2985984000000)^(1/3) + (21924189518329/2985984000000 - 977·‹8719602277256646/12441600000)^(1/3) + (977·‹8719602277256646/12441600000 + 21924189518329/2985984000000)^(1/3) + 951/200) + (‹800213046/115200 - 3225077/13824000)^(1/3) - (‹800213046/115200 + 3225077/13824000)^(1/3) - 241/120) � x = - ‹(‹(- (13997521·‹800213046/24883200000 - 45143083034117/2985984000000)^(1/3) + (13997521·‹800213046/24883200000 + 45143083034117/2985984000000)^(1/3) + (21924189518329/2985984000000 - 977·‹8719602277256646/12441600000)^(1/3) + (977·‹8719602277256646/12441600000 + 21924189518329/2985984000000)^(1/3) + 951/200) - (‹800213046/115200 - 3225077/13824000)^(1/3) + (‹800213046/115200 + 3225077/13824000)^(1/3) + 241/120) - ‹((‹800213046/115200 - 3225077/13824000)^(1/3) - (‹800213046/115200 + 3225077/13824000)^(1/3) + 241/240) - 3/4 � x = ‹(‹(- (13997521·‹800213046/24883200000 - 45143083034117/2985984000000)^(1/3) + (13997521·‹800213046/24883200000 + 45143083034117/2985984000000)^(1/3) + (21924189518329/2985984000000 - 977·‹8719602277256646/12441600000)^(1/3) + (977·‹8719602277256646/12441600000 + 21924189518329/2985984000000)^(1/3) + 951/200) - (‹800213046/115200 - 3225077/13824000)^(1/3) + (‹800213046/115200 + 3225077/13824000)^(1/3) + 241/120) - ‹((‹800213046/115200 - 3225077/13824000)^(1/3) - (‹800213046/115200 + 3225077/13824000)^(1/3) + 241/240) - 3/4) Das sind die exakten Lösungen dieser Gleichung. (< ist dabei das Wurzelzeichen, und das i mit dem Hütchen ist die imaginäre Zahl i, i=sqrt(-1). Da geht mit Copy&Paste was schief...)
Mach das mal per Hand.

_________________
We are, we were and will not be.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 09.03.05 11:21 
Und ich dachte schon, ich hätte keine Ahnung und meine Antwort wäre falsch. Diese System umgehen also einfach die Berechnung, indem sie die wichtigsten Standard-Werte und Ergebnisse "wissen". Dann ist ja jetzt alles klar.
In meiner Schüler und UNI-Zeit hatten wir diese Programme nicht zur Verfügung.

Zitat:
Das sind die exakten Lösungen dieser Gleichung. (< ist dabei das Wurzelzeichen, und das i mit dem Hütchen ist die imaginäre Zahl i, i=sqrt(-1). Da geht mit Copy&Paste was schief...)
Mach das mal per Hand.


Ich habe zur Zeit eine Nachhilfe-Schülerin in der 12. Klasse. Was glaubst wie ich das mache? Natürlich per Hand. 8)
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 09.03.05 11:30 
Hallo!

Zur Zahlendarstellung im Rechner findest Du auch in meinem Craschkurs Delphi einen Abschnitt. Eventuell wird Dir die prinzipielle Natur des Problems dadurch noch etwas deutlicher. ;-)

MfG
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Tilo Threadstarter
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: Sa 12.03.05 16:55 
Danke für Eure Hilfe,
werde einfach auf 15 Stellen nach dem Komma runden, Das müsste genügend genau sein.