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