![]() |
Fehler beim Runden
Warum rundet das Programm falsch ???
Aufgabe war die Dreiecksberechnung ohne Math-Unit zu benutzten
Delphi-Quellcode:
program Dreieck; {$APPTYPE CONSOLE} uses
SysUtils; var s, fa: integer; a, b, c, alpha_r, alpha_d, h, f, u: real; h_s, f_s, a_s, u_s, c_s, b_s, alpha_d_s: string; x: char; const phi = 3.14159265358979323846264; begin Repeat begin Writeln( 'Berechnung des Flaecheninhaltes, Umfanges, der anderen Seit und der Hoehe '); Writeln( 'eines Dreiecks durch die Eingab von 2 Seiten und dem dazwischen liegendem Winkel'); Writeln('Start mit Return-Taste'); readln(x); write('Erste Seite (c) in cm = '); readln(c); write('Zweite Seite (b) in cm = '); readln(b); write('Der Winkel zwischen den beiden Seiten (alpha) = '); readln(alpha_d); write('Genauigkeit des Rundens (Stellen)'); readln(s); case s of 1: fa := 10; 2: fa := 100; 3: fa := 1000; 4: fa := 10000; 5: fa := 100000; 6: fa := 1000000; 7: fa := 10000000; 8: fa := 100000000; 9: fa := 1000000000; 10: fa := 10000000000; else fa := 10000000000; Writeln(''); Writeln('Programm ist zu ungenau. Es wird mit 10 Stellen gerechnet') end; if alpha_d < 180 then begin alpha_r := alpha_d * (phi / 180); h := sin(alpha_r) * b; f := 0.5 * c * h; a := sqrt(b * b + c * c - 2 * b * c * cos(alpha_r)); u := a + b + c; c_s := FloatToStr(c); b_s := FloatToStr(b); alpha_d_s := FloatToStr(alpha_d); h_s := FloatToStr(round(h * fa) / fa); f_s := FloatToStr(round(f * fa) / fa); a_s := FloatToStr(round(a * fa) / fa); u_s := FloatToStr(round(u * fa) / fa); Writeln(''); Writeln('Das Dreieck mit der Seite c ', c_s, ' cm'); Writeln('und der Seite b ', b_s, ' cm'); Writeln('und dem Winkel alpha ', alpha_d_s, ' in Grad'); Writeln('hat einen Flaecheninhalt von ', f_s, ' cm im Quadrat'); Writeln('und einen Umfang von ', u_s, ' cm'); Writeln(''); Writeln('die letzte Seite a betraegt ', a_s, ' cm'); Writeln('und die Hoehe h ist ', h_s, ' cm'); Writeln(''); Writeln(h, ' h ', f, ' f ', a, ' a ', u, ' u'); end else Writeln('Das Dreieck ist nicht berechenbar'); Writeln(''); Writeln('Zum Beenden # eingeben und mit Return bestaetigen'); readln(x); end; Until x = '#' end. |
Re: Fehler beim Runden
Es wäre erst einmal schön zu wissen, wo und was das Programm denn falsch rundet.
Und zweitens sind bei der Verwendung von Fließkommazahlen Rundungsfehler nicht zu vermeiden. |
Re: Fehler beim Runden
Was ist für dich falsch Runden?
(hab es kurz getestet und bei Genauigkeit 5 sind auch 5 Nachkommastellen rausgekommen) |
Re: Fehler beim Runden
Es gibt
![]() Computer verwenden im allgemeinern das sog. Banker's rounding während du wahrscheinlich Kaufmännisches Runden erwartest. Die Funktion Round() verwendet das Banker' rounding Verfahren. PS: du verwendet den Datentyp REAL. Dieser Datentyp ist in Delphi veraltet und relativ ungenau. Ersetze real durch double (64bit) oder Extended (80bit)! |
Re: Fehler beim Runden
@woibauer
Die Funktionen round, div , mod und trunc könnten Dir evtl weiterhelfen Codebeispiele findest Du z.B. ![]() Gruß Wolfgang |
Re: Fehler beim Runden
Zitat:
|
Re: Fehler beim Runden
Real = Double (8 Byte),
aber man kann diesen aus Gründen der Abwärtskompatibilität via {$REALCOMPATIBILITY ON} als Real48 (6 Byte) definieren. |
Re: Fehler beim Runden
Und zu guter letzt sollte "phi" hier wohl besser "pi" heissen :)
|
Re: Fehler beim Runden
Kaufmännisch Runden auf n Stellen würde ich zunächst so versuchen:
Delphi-Quellcode:
Gruß
function round2(number:double;n:word):double;
begin case n of 2:begin number:=number*100; number:=number+0.5; number:=trunc(number); result:=number/100; end; end; procedure TForm1.Button1Click(Sender: TObject); var number:double; begin number:=StrToFloat(Edit1.Text); Edit2.Text:=FloatToStr(round2(number,2)); end; end. Wolfgang |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz