Function Min mit Currency-Werten in der 64 Bit Win-Version

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.

Function Min mit Currency-Werten in der 64 Bit Win-Version

Beitragvon Ally » 20. Mär 2018, 14:17 Function Min mit Currency-Werten in der 64 Bit Win-Version

Hallo zusammen,

bisher habe ich mit der 32 Bit Version von Lazarus unter Windows gearbeitet. Mit der 64 Bit Version und einem vorhandenen Projekt bin ich auf folgendes Problem gestoßen.

Code: Alles auswählen
{Result, Wert1 und Wert2 sind vom Typ Currency.}
 
Result := Min(Wert1, Wert2);
 
{erzeugt den Fehler: Error: Can't determine which overloaded function to call}


Für Min mit Currency-Werten ist weder in der 32 Bit Version noch in der 64 Bit Version eine Funktion vorhanden.
Warum funktioniert es in der 32 Bit Version?
Und warum gibt es für Min keine Currency-Version?

Gruß Roland
Ally
 
Beiträge: 75
Registriert: 11. Jun 2009, 08:25

Beitragvon Horst_h » 20. Mär 2018, 15:40 Re: Function Min mit Currency-Werten in der 64 Bit Win-Versi

Hallo,

http://www.delphibasics.co.uk/RTL.asp?Name=Currency
also scheint currency ( 53 bit Mantisse ) ein double-Wert zu sein.
Behelfsmässig
Code: Alles auswählen
program Project1;
uses
  math;
var
  Wert1,Wert2:currency;
 
function Min(val1,val2:currency):currency;overload;inline;
begin
  result := MIN(double(val1),double(val2));
end;
 
begin
  Wert1:= 1.004451;//1.00445 funktioniert nicht :-(
  Wert2:= 1.00444
  writeln('Wert1 ',Wert1);
  writeln('Wert2 ',Wert2);
  writeln(min(Wert1,Wert2));
  writeln(min(Wert2,Wert1));
end.

Ausgabe:
Code: Alles auswählen
 
Wert1  1.004500000000000000E+00
Wert2  1.004400000000000000E+00
 1.004400000000000000E+00
 1.004400000000000000E+00
 

Gruß Horst
Horst_h
 
Beiträge: 55
Registriert: 20. Mär 2013, 08:57

Beitragvon Ally » 20. Mär 2018, 16:04 Re: Function Min mit Currency-Werten in der 64 Bit Win-Versi

Hallo Horst,

danke für deine Antwort.
Ich habe mir einfach folgendes gebastelt:

Code: Alles auswählen
function MinCurrency(a, b: Currency): Currency;
begin
  if a < b then
    Result := a
  else
    Result := b;
end;


Das funktioniert auch einwandfrei.

Aber nochmal zu meiner Frage, warum funktioniert es in der 32 Bit Version?
Und warum gibt es für Min keine Currency-Version in Math?
Vielleicht liest ja hier jemand mit der das mal einbauen kann oder jemanden kennt der da kompetent ist.

Gruß Roland
Ally
 
Beiträge: 75
Registriert: 11. Jun 2009, 08:25

Beitragvon wp_xyz » 20. Mär 2018, 16:45 Re: Function Min mit Currency-Werten in der 64 Bit Win-Versi

Horst_h hat geschrieben:http://www.delphibasics.co.uk/RTL.asp?Name=Currency
also scheint currency ( 53 bit Mantisse ) ein double-Wert zu sein.

Da ist m.E. falsch. Wenn du dir die Wertebereiche von Int64 und Currency ansiehst (http://wiki.lazarus.freepascal.org/Data ... tete_Typen), dann erkennst du, dass beide dieselbe Ziffernabfolge haben, nur ist 4 Stellen von rechts ein Komma eingeschoben. D.h. Currency hat intern dieselbe Darstellung wie der Int64, der mit 10000 multipliziert worden ist. Aus diesem Grund sind Currency-Vergleiche problemlos möglich, Single-, Double- bzw. Extended-Vergleiche schlagen dagegen regelmäßig wegen Rundungsfehlern fehl.

Warum es die Funktion Min für Currency unter 64-Bit nicht gibt, weiß ich nicht. Ich vermute etwas triviales, wie "vergessen zu implementieren".
wp_xyz
 
Beiträge: 2439
Registriert: 8. Apr 2011, 08:01

Beitragvon m.fuchs » 20. Mär 2018, 16:49 Re: Function Min mit Currency-Werten in der 64 Bit Win-Versi

Welche Lazarusversion nutzt du denn? Ich hatte kein Problem Currency und Min einzusetzen mit 1.8.2 Linux x64.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
 
Beiträge: 1858
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.0, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon Socke » 20. Mär 2018, 16:51 Re: Function Min mit Currency-Werten in der 64 Bit Win-Versi

Dann verweist doch direkt auf die offizielle Dokumentation: https://www.freepascal.org/docs-html/cu ... 300003.1.2

Ally hat geschrieben:Aber nochmal zu meiner Frage, warum funktioniert es in der 32 Bit Version?
Und warum gibt es für Min keine Currency-Version in Math?
Vielleicht liest ja hier jemand mit der das mal einbauen kann oder jemanden kennt der da kompetent ist.

Erstelle hierzu bitte einen Bug-Report unter http://bugs.freepascal.org/
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Socke
 
Beiträge: 2462
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 8.1/Debian GNU/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon Ally » 20. Mär 2018, 18:15 Re: Function Min mit Currency-Werten in der 64 Bit Win-Versi

Hallo wp_xyz,

die Variante "vergessen zu implementieren" halte ich auch für sehr wahrscheinlich, zumal die andern Typen von Integer bis Extended vorhanden sind. Lediglich Cardinal wurde, mit der Begründung "this causes more trouble than it solves", auskommentiert.


Hallo m.fuchs,

ich habe hier Lazarus 1.8.2/ FPC 3.0.4 - 64 Bit Windows und Lazarus 1.8.2/ FPC 3.0.4 - 32 Bit Windows.
Beide laufen auf je einem Rechner mit Windows 10 - 64 Bit.


Hallo Socke,

das mit dem Bug-Report gehört jetzt nicht gerade zu meinen Kernkompetenzen, vielleicht könntest du das ja übernehmen. :roll:


Gruß Roland
Ally
 
Beiträge: 75
Registriert: 11. Jun 2009, 08:25

Beitragvon Horst_h » 22. Mär 2018, 10:16 Re: Function Min mit Currency-Werten in der 64 Bit Win-Versi

Hallo,

Apropos:
D.h. Currency hat intern dieselbe Darstellung wie der Int64

Ich bezog mich auf die Angabe bei DelphiBasics.53 Bit Mantisse ist double.
Delphi <> FPC
Int64 war schon seit Turbo-Pascal ?.? üblich.
Wenn man in den Kompilerquelltext unter rtl/inc/gencurr.inc schaut steht dort
{$ifdef FPC_CURRENCY_IS_INT64}

Es gibt wohlmöglich auch eine { zukünftig } andere Version davon.

Gruß Horst
Horst_h
 
Beiträge: 55
Registriert: 20. Mär 2013, 08:57

Beitragvon Socke » 22. Mär 2018, 11:53 Re: Function Min mit Currency-Werten in der 64 Bit Win-Versi

Horst_h hat geschrieben:Wenn man in den Kompilerquelltext unter rtl/inc/gencurr.inc schaut steht dort
{$ifdef FPC_CURRENCY_IS_INT64}

Es gibt wohlmöglich auch eine { zukünftig } andere Version davon.

Aktuell gibt es AFAIK keine andere Version. Es ist nur ein übliches Vorgehen um weitere Versionen schnell und ohne Effekte auf die bisherigen Implementierungen einbauen zu können.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Socke
 
Beiträge: 2462
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 8.1/Debian GNU/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

• Themenende •

Zurück zu Lazarus - Bugs



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron
porpoises-institution
accuracy-worried