Also ich handhabe soetwas (z.B. bei Währungen) mit jeweils normalen Rechenoperationen und anschließender Rundung...
Floats sind immer fürn Arsch.
Am Besten speichert man solche Werte fixed: also z.B. 0.00 für Währungen oder 00.0 für Prozente.
Berechnungen sind temporär gerundet ausgegeben, abgespeichert werden die Ursprungswerte mit fixen Nachkommastellen.
Berechnet wird dann 127,81€ * 19% mit ROUND(12781*19/100/100) als Ganzzahl.
Da Pascal (für mich) komplett wiedersinnig rundet, verwende ich eine eigene Round-Funktion. Bänkerrundung mag theoretisch durchschnittlich genauer sein, aber ich weiß immer noch nicht, wie ich das dem Finanzbeamten bei der aktuellen Rechnung erklären soll
Unterschied 32 Bit 64 Bit Pascalprogramm
-
- Lazarusforum e. V.
- Beiträge: 280
- Registriert: Sa 26. Mai 2012, 17:31
- OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
- CPU-Target: 64Bit
Re: Unterschied 32 Bit 64 Bit Pascalprogramm
just my two Beer
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Unterschied 32 Bit 64 Bit Pascalprogramm
Fixpunkt bietet sich Grade für Rechnungen und Buchhaltungssoftware an, da Preise für gewöhnlich in Dezimalzahlen sind die sich nicht als float korrekt darstellen lassen (z.b. 95 oder 99 Cent Anteil) und man fast ausschließlich addiert und mit ganzen Zahlen multipliziert, wobei man dann gar keinen Rundungsfehler hat.
Double ist meistens ausreichend (z.b. Excel benutzt intern Double und gibt genug unternehmen die ihre Buchhaltung mit Excel machen), aber wie gesagt, es ist nicht nur ungenau (im biillionenstel Cent bereich) sondern ist auch noch nervig mit Gleichheitsvergleichen.
Mit runden meinst du vermutlich nearest even rounding. Da bist du ein Opfer vom schlechten Schulsystem geworden, das Kindern eintrichtet das man bei 0,5 immer aufrunden, obwohl das mathematisch 0 Sinn macht.
Ich hab's hier schon öfter erklärt, ich werde nicht ins Detail gehen, aber nearest even rounding reduziert den Durchschnittlichen Rundungsfehler und ist eigentlich in absolut jeder Situation besser.
Double ist meistens ausreichend (z.b. Excel benutzt intern Double und gibt genug unternehmen die ihre Buchhaltung mit Excel machen), aber wie gesagt, es ist nicht nur ungenau (im biillionenstel Cent bereich) sondern ist auch noch nervig mit Gleichheitsvergleichen.
Mit runden meinst du vermutlich nearest even rounding. Da bist du ein Opfer vom schlechten Schulsystem geworden, das Kindern eintrichtet das man bei 0,5 immer aufrunden, obwohl das mathematisch 0 Sinn macht.
Ich hab's hier schon öfter erklärt, ich werde nicht ins Detail gehen, aber nearest even rounding reduziert den Durchschnittlichen Rundungsfehler und ist eigentlich in absolut jeder Situation besser.
-
- Beiträge: 6899
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Unterschied 32 Bit 64 Bit Pascalprogramm
Mich hat dies auch mal fast bis zu Wahnsinn getrieben.Da Pascal (für mich) komplett wiedersinnig rundet, verwende ich eine eigene Round-Funktion. Bänkerrundung mag theoretisch durchschnittlich genauer sein, aber ich weiß immer noch nicht, wie ich das dem Finanzbeamten bei der aktuellen Rechnung erklären soll
Ich hatte immer einen Grafikfehler bei einer 3D-Darstellung. Zuerst hatte ich vermutet, das meine Formel im Algorithmus falsch ist, bis ich bemerkte, das meine Kiste falsch rechnete.
viewtopic.php?f=10&t=11620&hilit=round
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 945
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: Unterschied 32 Bit 64 Bit Pascalprogramm
Ich nehme mal an du meinst 64-bit unter Windows.fliegermichl hat geschrieben: Di 22. Aug 2023, 10:07 Mir ist eine unterschiedliche Programmausführung zwischen der 32 Bit und der 64 Bit Version aufgefallen, die sich auf folgenden Codeschnipsel zurückführen lässt.Die Delphi und die 32 Bit FPC Version zeigen "nicht gleich" an. Die 64 Bit Version zeigt "gleich" an.Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject); var d : Double; begin d := -0.2; if (d = -0.2) then showmessage('gleich') else showmessage('nicht gleich'); end;
Irgendwie merkwürdig.
Für Konstanten verwendet der Compiler die höchste vorhandene Präzision, welche auf x86 Systemen mit Ausnahme von x86_64-win64 eben Extended ist und auf allen anderen Systemen (inklusive x86_64-win64) Double ist. Deshalb hast du da das unterschiedliche Verhalten. Es wird so oder so empfohlen für den Vergleich von Fließkommazahlen die SameValue Funktion aus der Unit Math zu nutzen, da du bei dieser ein Epsilon mit angeben kannst, damit den Ungenauigkeiten von Fließkommazahlen bedacht werden kann.
FPC Compiler Entwickler