Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   Chromaprint: Unterschied Numerik Delphi vs FPC (https://www.delphipraxis.net/185864-chromaprint-unterschied-numerik-delphi-vs-fpc.html)

SonnyBoyPro 13. Jul 2015 12:12

Chromaprint: Unterschied Numerik Delphi vs FPC
 
Hallo zusammen,

bin gerade dabei die Chromaprint/AcoustID (https://acoustid.org/chromaprint) nach Pascal zu transferieren.
Nun taucht bei den Samples folgendes Problem auf. Das Resampling von Mono 8000bit funktioniert
unter Delphi zu 100%. Bei FPC gibts an ein paar Stellen einen Unterschied.

Code:
Test Resample Mono 8000
=======================
Buffer Data Size and Readed Data Size: OK
Signals differ at index: 1148, -1 || 0
Signals differ at index: 11628, 1161 || 1162
Signals differ at index: 12588, 7747 || 7746
Signals differ at index: 12748, 1345 || 1344
Signals differ at index: 12988, -5070 || -5069
Signals differ at index: 13548, 6185 || 6186
Signals differ at index: 14588, -2472 || -2473
Signals differ at index: 14668, 1049 || 1050
Signals differ at index: 14988, -3245 || -3244
Buffer Data and Readed Data equal: NOT OK
Error Count: 9 / 22040
jetzt nicht wirklich viele Unterschiede, da aber aus dem ganzen ja einmal ein Fingerprint für ne Audiodatei werden soll beunruhigt mich das schon ein wenig. Der Source ist für Delphi und FPC der gleiche. Also kann's nur am Compiler liegen.

Wie bekommt man das hin, dass sich FPC mathematisch gesehen "gleich" verhält wie Delphi?

BG

gammatester 13. Jul 2015 14:22

AW: Chromaprint: Unterschied Numerik Delphi vs FPC
 
Ich nehme an, Du benutzt Double-Fließkomma. Welche FPC-Version, 32- oder 64-Bit? Bei meiner DAMath-Bibliothek habe ich festgestellt, daß einige FPC-Math-Routinen unbrauchbar sind (ln1xp etc), exp verliert bis zu 13 bit. Dies gilt für Versionen <= 2.6.4. Bei den Development-Versionen 3.0.1 und 3.1.1 gibt es einige Verbesserungen.

Ich würde als erstes mal die neuen Versionen versuchen, falls Du es nicht bereits so machst. Falls das nichts hilft, die verdächtigen Funktionen (sin, cos, exp etc) isolieren und durch DAMath-Funktionen ersetzen.


Edit: Ein weiteres Problem sind Divisionen von Fließkomma-Konstanten durch Integer wie zB
Delphi-Quellcode:
{
Win64>FB.exe
         3.33333343267441E-001         2.98023223876953E-008

Win32>FB.exe
         3.33333333333333E-001        -5.55111512312578E-017
}

var
  d: double;
  n: integer;
begin
  n := 3;
  d := 1.0/n;
  writeln(d:30, n*d - 1.0:30);
end.
Hier rechnen alle 64-Bit-Win-FPCs bis 3.1.1 in single precision!!?? mit entsprechender Ungenauigkeit, habe versucht das als Bug zu reporten, ist aber als Feature abgelehnt, weil 1.0 halt exakt als Single darstellbar ist.

BUG 13. Jul 2015 14:32

AW: Chromaprint: Unterschied Numerik Delphi vs FPC
 
Gerade für ungenaues Fingerprinting sollten ein paar Ungenauigkeiten aber nicht so schlimm sein :gruebel:

PS: Du beugst read falsch.

SonnyBoyPro 13. Jul 2015 22:10

AW: Chromaprint: Unterschied Numerik Delphi vs FPC
 
Hallo gammatester,

ja genau das war das Problem, Bessel Funktion etc. sowie die Divsionen von Double durch Integer.
Ich hab nun Deine DaMath eingebunden, und siehe da es funktioniert. Nun wird auch das 8000 Mono Example richtig gerechnet.

Besten Dank!


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 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