C++ tanh function liefert andere Ergebnisse als FPC tanh function [gelöst]

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

C++ tanh function liefert andere Ergebnisse als FPC tanh function [gelöst]

Beitrag von corpsman »

Servus zusammen,

ich debugge hier gerade eine extrem empfindliche Anwendung und wundere mich warum meine Ergebnisse so schlecht sind.

Nach ettlichem Suchen habe ich nun folgende Situation nachstellen können:
Finding2.png
(234.69 KiB) Noch nie heruntergeladen
Man kann hier 2 mal den Gleichen Code sehen, links in FPC rechts in C++ Blubber speichert jeweils den Wert von MoveY for dem tanh aufruf.
Wie man sehen kann unterscheiden sich die Ergebnisse doch deutlich, das ist nicht mal eine Einfache Rundung.

Weiß hier jemand wie man "Einfluss" auf das Ergebnis der tanh funktion nehmen kann ?
ich habe bereits versucht die Genauigkeit in 64-Bit Rechnen zu lassen das hilft aber leider auch nicht wirklich, da es dann an anderer Stelle Kracht.
Hab auch schon versucht mit diesen kleinen "Hilfsfunktion" die C-Variante direkt in meinen Code ein zu linken:

Code: Alles auswählen

#include <math.h>
float c_tanh(float val)
{
  return tanh(val);
}
daraus macht man mittels
gcc -O0 -g -o c_math.o -Wall -c c_math.c
ein .o file das man dann einbinden können sollte, aber dann kommt die folgende Fehlermeldung:
Linker_Fehler.png
Linker_Fehler.png (57.69 KiB) 1310 mal betrachtet
Zuletzt geändert von corpsman am Do 1. Dez 2022, 06:12, insgesamt 1-mal geändert.
--
Just try it

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: C++ tanh function liefert andere Ergebnisse als FPC tanh function

Beitrag von Winni »

Hi!

Benutzen Deine C-Funktionen als Rüchgabewert Single (=32 Bit)?

tanh aus der Unith Mathgeben exended zurück, was je nach Rechner-Architektur 80 oder 64 Bit sind.

Vielleicht liegt da der Fehler?

Winni

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: C++ tanh function liefert andere Ergebnisse als FPC tanh function

Beitrag von corpsman »

Die C-Version nutzt nur 32-Bit, denke auch das das das Problem ist. Wenn ich im FPC die Extended nach 32-Bit umwandeln lasse dann passt es aber auch nicht :-(
--
Just try it

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: C++ tanh function liefert andere Ergebnisse als FPC tanh function

Beitrag von Mathias »

Könnte noch ein big/little Endian Problem sein. Aber dafür kennen ich C zu wenig.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: C++ tanh function liefert andere Ergebnisse als FPC tanh function

Beitrag von af0815 »

Mathias hat geschrieben:
So 27. Nov 2022, 18:17
Könnte noch ein big/little Endian Problem sein. Aber dafür kennen ich C zu wenig.
Sorry, aber wenn es daran liegt wären die Zahlen komplett daneben.

Das Problem dürfte in dEn Zahlen liegen, die Sich auf einer Plattform nicht genau Abbilden lassen, damit schleichen sich Fehler ein. Die Frage ist auch, wer Rechnet genauer.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: C++ tanh function liefert andere Ergebnisse als FPC tanh function

Beitrag von Winni »

hi

Also tanh macht nicht mal Assembler-Sperenzien.
Trivialer Code:

Code: Alles auswählen

function tanh(x : float) : float;
  var Temp : float;
  begin
     if x>MaxTanh then exit(1.0)
     else if x<-MaxTanh then exit (-1.0);
     temp:=exp(-2*x);
     tanh:=(1-temp)/(1+temp)
  end;    

wobei Float = extended ist.


Und am Byte-Sex soll es ja wohl nicht liegen. Um so etwas haben sich Compielr zu kümmern, solange man nicht in den Eingeweiden rumwühlt.

Da stimmt etwas in C++ nicht. Wie so oft.

Winni

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: C++ tanh function liefert andere Ergebnisse als FPC tanh function

Beitrag von wp_xyz »

@corpsman: Wolfram Alpha spuckt bei tanh(-0.13156274) den folgenden Wert aus (mit "more digits"), im Vergleich zum selbst berechneten FPC- und Delphi-Wert (double) und dem von deinem Screenshot abgeschriebenen C-Wert:

Code: Alles auswählen

Wolfram Alpha:    -0.130808896415771523076410687550922723969437359659465082874
FPC:              -0.13080889641577154
Delphi:           -0.130808896415772
C:                -0.130808905
Da sind FPC und Delphi schon ziemlich nahe dran...

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: C++ tanh function liefert andere Ergebnisse als FPC tanh function

Beitrag von Winni »

Hi!

Das sieht doch ziemlich eindeutig nach "Kampf" zwischen Single und Double aus:

Single kann 7-8 Stellen Genauigkeit, Double 15-16. Na, dann schönes Zählen!

Winni

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: C++ tanh function liefert andere Ergebnisse als FPC tanh function

Beitrag von Winni »

Hi!

Wer Genaueres über Single, Double und Extended wissen möchte, liest

https://de.wikipedia.org/wiki/IEEE_754

Gilt auch für C++

Winni

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: C++ tanh function liefert andere Ergebnisse als FPC tanh function

Beitrag von corpsman »

*g*

Danke jungs für eure Ideen,

Aktuell habe ich das Problem, dass ich in einem 3000-5000 Zeilen Program den Fehler suche, ich hab das Programm in 2 Versionen vorliegen. Mein FPC-Port und das Original in C++. Mittlerweile kann ich wie im Screenshot zu sehen ist, via Schritt für Schritt debugger durch beide Programme durch. Aufrund des Tanh entscheided sich das C Programm einige Zeilen später in einen Weg ab zu biegen der komplett anders ist als der des FPC-Programms. Damit verliere ich an genau dieser Stelle die Möglichkeit den eigentlichen Fehler zu finden, weil ab jetzt beide Programme auseinader laufen :-(.
=> Wenn ich es schaffe beide Programme an der Stelle "=" weiter laufen zu lassen habe ich eine Chance den Fehler zu finden. Da in dem Programm Neuronale Netze sind braucht man eben leider die Tanh funktion ..

Ich hab zugriff auf beide Sourcen, könnte also auch den C++ Part "Manipulieren". Dank eines unit tests kann ich auch prüfen ob mein gesamt Ergebnis am ende verfälscht wird.

Für Ideen bin ich offen ..
--
Just try it

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: C++ tanh function liefert andere Ergebnisse als FPC tanh function

Beitrag von wp_xyz »

Aufgrund welches Kriteriums entscheidet denn das Programm, welchen Weg es gehen soll? Aufgrund eines Vergleich des tanh-Werts? Dann prüfe nicht auf "=" (das ist bei Floats immer dumm), sondern nimm SameValue und gib eine relativ großzügige Toleranzschwelle an (1E-8).

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: C++ tanh function liefert andere Ergebnisse als FPC tanh function

Beitrag von corpsman »

Also ich hab nun endlich den Fehler gefunden,..
Die tanh routine "darf" von der c++ version ab weichen, das Problem war eben nur, dass der C++ Code dann nicht mehr 1;1 mit dem FPC vergleichbar ist. Durch einfügen von Knapp 200000 Mespunkten und Auswerten (bei einer Toleranz bis 0.0015) habe ich nun aber den Bug an einer anderen Stelle gefunden und behoben,
Danke für den Austausch..

Und wer neugierig ist was ich da gemacht habe, auf dem Lazarustreffen am 21.1 stelle ich es vor (y)
--
Just try it

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: C++ tanh function liefert andere Ergebnisse als FPC tanh function

Beitrag von Winni »

Hi!

Und die, die nicht zum Lazarus-Treffen kommen, bleiben ihr Leben lang in Unwissenheit?

Das ist unfair.

Winni

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 331
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: C++ tanh function liefert andere Ergebnisse als FPC tanh function

Beitrag von Niesi »

corpsman hat geschrieben:
Di 29. Nov 2022, 19:36
Also ich hab nun endlich den Fehler gefunden,..
Die tanh routine "darf" von der c++ version ab weichen, das Problem war eben nur, dass der C++ Code dann nicht mehr 1;1 mit dem FPC vergleichbar ist. Durch einfügen von Knapp 200000 Mespunkten und Auswerten (bei einer Toleranz bis 0.0015) habe ich nun aber den Bug an einer anderen Stelle gefunden und behoben,
Danke für den Austausch..

Und wer neugierig ist was ich da gemacht habe, auf dem Lazarustreffen am 21.1 stelle ich es vor (y)

Hi,

Erstens schliesse ich mich der Meinung von Winni an: hier im Forum Informationen abgreifen und dann die Loesung geheim halten ist irgendwo ganz schlechter Stil. Und auch irgendwie nicht der Sinn dieses Forums, oder?

Zweitens ist tanh eine mathematische Funktion, die immer ein eindeutiges Resultat liefert. Die darf auch in Gaensefuesschen nicht abweichen - so etwas schmerzt. Die Ungenauigkeiten sind sicher Rundungsfehler, schon mit einer einfachen tan-Funktion kann es da erhebliche Abweichungen geben.

Warum neuronale Netze die Verwendung der tanh-Funktion bedingen verstehe ich nicht, waere ueber ein Erlaeterung aber froh ...

Beste Gruesse
Harald
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: C++ tanh function liefert andere Ergebnisse als FPC tanh function

Beitrag von Winni »

Niesi hat geschrieben:
Mi 30. Nov 2022, 11:05
Warum neuronale Netze die Verwendung der tanh-Funktion bedingen verstehe ich nicht, waere ueber ein Erlaeterung aber froh ...

Beste Gruesse
Harald
Hi!

Kurzer komprimierter Rundschlag:

https://artemoppermann.com/de/aktivierungsfunktionen/


Winni

Antworten