AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Rundungs-Probleme bei Ausgabe als String
Thema durchsuchen
Ansicht
Themen-Optionen

Rundungs-Probleme bei Ausgabe als String

Ein Thema von raller09 · begonnen am 15. Feb 2018 · letzter Beitrag vom 16. Feb 2018
 
raller09

Registriert seit: 7. Nov 2005
38 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: Rundungs-Probleme bei Ausgabe als String

  Alt 15. Feb 2018, 13:41
Was ist das für eine Dll?

Einfach aus Erfahrung: Nach dem Aufruf einer Fremdle kannst Du nie davon ausgehen das
die FPU noch den gewünschten State hat. Deshalb for dem Aufruf mit
GetFPURoundMode sichern und nachher mit SetFPURoundMode() wieder setzen.
Das ist ein sehr guter Hinweis!

Ich nutze lpsolve für eine lineare Optimierung (https://sourceforge.net/projects/lpsolve/).
Das ist eine in C geschriebene .dll.

In der Delphi-Zugriffs-Datei steht:
Code:
 *  Important information
 *  Solver library is compiled for a different Control Word, you should change
 *  the Delphi control Word to avoid foating point operation errors.
 *                _control87     Set8087CW
 *  Visual Studio $9001F    ->  639
 *  GCC          $8001F    ->  895
und in der IDE (Main.pas -> in Delphi geschrieben):
Delphi-Quellcode:
initialization
  set8087cw(895);

end.
Ich habe jetzt meine Kommunikation mit der .dll in folgenden Block gepackt:
Delphi-Quellcode:
  //lRoundingMode := GetRoundMode;
  l8087CW := Get8087CW;
  try
    {
    Hier der gesammte Zugriff auf die .dll
    }

  finally
    ShowMessage( (*
                'alt: ' + TRttiEnumerationType.GetName( lRoundingMode) +
                sLineBreak +
                'neu: ' + TRttiEnumerationType.GetName( GetRoundMode) +
                sLineBreak +
                *)

                 'alt: ' + IntToStr( l8087CW) +
                 sLineBreak +
                 'neu: ' + IntToStr( Get8087CW)
                 );

    //SetRoundMode( lRoundingMode);

    Set8087CW( l8087CW);
  end;
Das liefert mir:

1.Aufruf
alt: 4991
neu: 610

folgende Aufrufe:
alt: 4991
neu: 4962

Da ich den Wert mittels "Set8087CW" nach der .dll zurückstelle, passt "meine" Rundung/String-Erstellung, ohne das ich irgendwie zusätzlich runden muss...(hat auch tatsächlich nicht korrekt funktioniert)!


Was mich jetzt aber noch stört: Die .dll hat beim 2ten Aufruf einen anderen Wert gesetzt.
Verändert sich dadurch das Verhalten der .dll? (vermutlich, oder?)
Könnt ihr mir hier weiterhelfen, oder muss ich das mit dem Erstellern der .dll klären?


Darf ich im laufenden Programm Set8087CW nutzen? Was wird dadurch gemacht?


Danke,
  Mit Zitat antworten Zitat
 

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:31 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-2025 by Thomas Breitkreuz