Unterschied 32 Bit 64 Bit Pascalprogramm

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Joh
Lazarusforum e. V.
Beiträge: 191
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

Beitrag von Joh »

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
just my two Beer

Warf
Beiträge: 1913
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Unterschied 32 Bit 64 Bit Pascalprogramm

Beitrag von Warf »

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.

Mathias
Beiträge: 6209
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

Beitrag von Mathias »

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
Mich hat dies auch mal fast bis zu Wahnsinn getrieben.
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

PascalDragon
Beiträge: 834
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

Beitrag von PascalDragon »

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.

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;
Die Delphi und die 32 Bit FPC Version zeigen "nicht gleich" an. Die 64 Bit Version zeigt "gleich" an.
Irgendwie merkwürdig.
Ich nehme mal an du meinst 64-bit unter Windows.

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

Antworten