AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Ceil Floor Log10 - Rundungsfehler, Überlauf o.ä. (?)
Thema durchsuchen
Ansicht
Themen-Optionen

Ceil Floor Log10 - Rundungsfehler, Überlauf o.ä. (?)

Ein Thema von hansmaad · begonnen am 18. Mai 2011 · letzter Beitrag vom 19. Mai 2011
Antwort Antwort
Seite 1 von 2  1 2      
hansmaad

Registriert seit: 25. Feb 2010
52 Beiträge
 
Delphi 2010 Professional
 
#1

Ceil Floor Log10 - Rundungsfehler, Überlauf o.ä. (?)

  Alt 18. Mai 2011, 13:36
Delphi-Version: 2010
Hallo zusammen,
ich steh gerade total auf dem Schlauch und kann mir den folgenden Fehler nicht erklären:

Delphi-Quellcode:
procedure Test(min, max : Double);
var
    x : Integer;
    a, b : Double;
begin
    x := Ceil(Log10(max)) - Floor(Log10(min)) + 1;
    WriteLn(x);

    a := Log10(max);
    b := Log10(min);
    x := Ceil(a) - Floor(b) + 1;
    WriteLn(x);
end;

begin
    Test(1e-2, 1e8);
    Test(1e-2, 1e7);
    Test(1e-2, 1e6);
end.
Code:
11
11
11
10
9
9
Die Ausgabe sollte natürlich sein:
Code:
11
11
10
10
9
9
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

AW: Ceil Floor Log10 - Rundungsfehler, Überlauf o.ä. (?)

  Alt 18. Mai 2011, 14:13
Was passiert, wenn du den Variablen a und b den Datentyp Extended gibst?
Andreas
  Mit Zitat antworten Zitat
hansmaad

Registriert seit: 25. Feb 2010
52 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Ceil Floor Log10 - Rundungsfehler, Überlauf o.ä. (?)

  Alt 18. Mai 2011, 14:21
Code:
11
11
11
11
9
9
Jetzt bin ich noch verwirrter.
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#4

AW: Ceil Floor Log10 - Rundungsfehler, Überlauf o.ä. (?)

  Alt 18. Mai 2011, 14:54
Ich weiß nicht, ob es hilft, aber guck auch mal hier:
http://home.netsurf.de/wolfgang.ehrh...tml#amath_unit

Geändert von Jens01 (18. Mai 2011 um 15:02 Uhr)
  Mit Zitat antworten Zitat
hansmaad

Registriert seit: 25. Feb 2010
52 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Ceil Floor Log10 - Rundungsfehler, Überlauf o.ä. (?)

  Alt 18. Mai 2011, 15:03
Ich weiß nicht, ob es hilft, aber guck auch mal hier:
http://home.netsurf.de/wolfgang.ehrh...tml#amath_unit
Ohne nachvollzogen zu haben, ob das jetzt mit dem Fehler hier zu tun hat...
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#6

AW: Ceil Floor Log10 - Rundungsfehler, Überlauf o.ä. (?)

  Alt 18. Mai 2011, 15:09
Naja, ich hab mir Dein Problem nur kurz angeguckt -ist ja nicht mein Problem.
Aber ich weiss, dass in amath einige Fehler von math ausgeräumt wurden, auch Rundungsprobleme. Vielleicht fällt das bei Dir ja auch darunter.
Ausprobieren bzw gucken muß Du aber selbst, oder es lassen.
  Mit Zitat antworten Zitat
hansmaad

Registriert seit: 25. Feb 2010
52 Beiträge
 
Delphi 2010 Professional
 
#7

AW: Ceil Floor Log10 - Rundungsfehler, Überlauf o.ä. (?)

  Alt 18. Mai 2011, 15:17
Ich glaub du hast meine Antwort falsch verstanden. Ich meinte ich habe zwar nicht nachvollzogen, ob das hier mit dem Thread zusammenhängt, aber ich bin absolut geschockt. Hab mich zwar inzwischen daran gewöhnt, ab und zu mal einen halben Tag wegen irgendwelchen blöden Delphi Bugs zu verschwenden, aber dass solche elementaren Dinge seit 15 Jahren so falsch sind, ist ja echt krass.
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#8

AW: Ceil Floor Log10 - Rundungsfehler, Überlauf o.ä. (?)

  Alt 18. Mai 2011, 15:31
Hab mich zwar inzwischen daran gewöhnt, ab und zu mal einen halben Tag wegen irgendwelchen blöden Delphi Bugs zu verschwenden, aber dass solche elementaren Dinge seit 15 Jahren so falsch sind, ist ja echt krass.
Eigentlich wollte ich dich gerade bremsen, nicht über die Bugs bei Fließkommazahlen herzuziehen und habe mal einen Test mit C# gemacht. Siehe da: Dort kommt das richtige Ergebnis raus. Da intern eigentlich CPU-Zahlen (oder FPU) verwendet werden sollten, hätte das doch eigentlich stimmen müssen, was das Delphi-Programm ausgibt, aber scheinbar tut es das nicht. Komisch.

Code:
namespace Test_Rundung
{
   class Program
   {
      
      
      static void Test(double min, double max) {
         int x;
         double a;
         double b;
         
         x = Convert.ToInt32(Math.Ceiling(Math.Log10(max))) - Convert.ToInt32(Math.Floor(Math.Log10(min))) + 1;
         Console.WriteLine(x);
         
         a = Math.Log10(max);
          b = Math.Log10(min);
          
          x = Convert.ToInt32(Math.Ceiling(a)) - Convert.ToInt32(Math.Floor(b)) + 1;
         Console.WriteLine(x);
      }

   
   
      public static void Main(string[] args)
      {
         Console.WriteLine("Hello World!");
         
          Test(1e-2, 1e8);
          Test(1e-2, 1e7);
          Test(1e-2, 1e6);

         
         Console.Write("Press any key to continue . . . ");
         Console.ReadKey(true);
      }
   }
}
Versuche mal folgendes: Delphi neu starten, Programm neu kompilieren und wenn das nicht reicht: Rechner neu starten.

Bernhard

PS: Die Einrückung der Forensoftware ist wieder brutal toll.
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
hansmaad

Registriert seit: 25. Feb 2010
52 Beiträge
 
Delphi 2010 Professional
 
#9

AW: Ceil Floor Log10 - Rundungsfehler, Überlauf o.ä. (?)

  Alt 18. Mai 2011, 15:39
Ich hatte den gleichen Test auch vorher mit vc und gcc gemacht. Aber da gibt ceil und floor ja (wie c#) eine Fließkommazahl zurück, daher dachte ich, ich würde bei Delphi irgendwas übersehen.
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#10

AW: Ceil Floor Log10 - Rundungsfehler, Überlauf o.ä. (?)

  Alt 18. Mai 2011, 21:21
Deine Idee ist zwar ein Disaster-Konzept, weil Differenzen von zwei Sprungfunktionen geradezu danach schreien, solche Effekte hervorzurufen; in Deinem Fall für Werte, die keine Zehnerpotenzen sind.

Interessant ist jedoch an Deinem Problem folgendes:

Es sieht so aus als wenn Du auf eine Inkonsistenz der FPU gestoßen bist. log10(x) wird im Prinzip als log10(2)*log2(x) berechnet. Wenn man das so programmiert, verschwindet auch Dein Problem. Etwas mehr Hintergrund-Info nach einiger Knobelei:
Delphi-Quellcode:
{---------------------------------------------------------------------------}
function log10(x: extended): extended; assembler;
  {-Return base 10 logarithm of x}
asm
  fldlg2
  fld [x]
  fyl2x
  fwait
end;

{---------------------------------------------------------------------------}
function log10a(x: extended): extended; assembler;
  {-Return base 10 logarithm of x}
asm
  fld1
  fld [x]
  fyl2x
  fldlg2
  fmul
end;
Die beiden Funktionen sollten eigentlich dieselben Ergebisse bringen, log10(x) rechnet log10(2) * log2(x) via FPU-Befehl fyl2x und log10a(x) rechnet (1*log2(x)) * log10(2). Für x=1e7 rechnet log10a richtig und log10 (die Delphi-Implementation) um 1 ulp zu hoch (die $-Zahlen sind die internen extended Darstellungen via AMath und MPArith)

Code:
log10a(1e7) = $4001E000000000000000 = 7.0
log10(1e7) = $4001E000000000000001 = 7.00000000000000000043368086899420177360298112034797668457031
Gruß Gammatester
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz