• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

C++: Source Code von cmath Funktionen

davidhigh

Newbie
Hallo allerseits,

ich habe jetzt schon ein bißchen gesucht, kann aber weder im Netz noch auf meinem PC den source code der cmath (bzw. math.h) Funktionen finden.
Weiß jemand, wo man den für einen gegebenen Compiler (gcc 4.3) finden kann ?

Der Hintergrund: Ich würde gerne mal nachschauen, ob da auch alles optimal gemacht wird. Ein Professor behauptete nämlich, dass C++ gerade bei den komlexen Funktionen (wie exp(z),sin(z),..) nicht unbedingt so effizient wie möglich programmiert sei.

Danke im Voraus,
Gruß, David
 

Tooltime

Advanced Hacker
Du musst doch eigentlich nur den Header zurück verfolgen. Wahrscheinlich landest du dann irgendwann im Kernel, wo die Unterscheidung zwischen CPU's mit und ohne Mathe-Coprozessor getroffen wird. Auch wenn solche CPU's wahrscheinlich nur in Routern oder ähnlichen vorkommen werden.

davidhigh schrieb:
Der Hintergrund: Ich würde gerne mal nachschauen, ob da auch alles optimal gemacht wird.
Wie sieht das deiner Meinung nach optimal aus? Nach meiner Erfahrung ist schon die Arithmetik mit cmath langsam, da die Basis der komplexen Zahl eine Struktur ist.
 
OP
D

davidhigh

Newbie
Naja,

mit optimal mein ich natürlich nix bestimmtes ;-)

aber ein Beispiel brachte dieser Prof:

er behauptete, dass er (vor vielen Jahre) z.B. die komplexe Sinusfunktion so implementiert fand, wie sie auch definiert ist:
Code:
sin(z) = (exp(z) - exp(-z))/2i
Das erfordert zwei Auswertungen der Exponentialfunktion, obwohl man auch mit einer Auswertung und einer Inversion zurande käme.

Ein weiteres Beispiel:
Wenn man sie komplexe Exponentialfunktion nach der Eulerformel implementiert
Code:
exp(-I*x) = cos(x) + i* sin(x)
verschenkt man auch was, da es so schneller geht
Code:
y=tan(x/2)
sin(x) = 2*y/(1+y*y)
cos(x) = (1-y*y)/(1+y*y)
d.h. man hat nur eine transzendente Funktion auszuwerten.

Sowas mein ich.

Kannst du vllt. nochmal genauer sagen, was du mit den Header zurück verfolgen meinst ? Ich finde in der math.h nichtmal sowas wie exp().

Gruss, David
 

Tooltime

Advanced Hacker
Naja, prinzipiell muss halt alle Header verfolgen. Und die exp-Funktion (reell) ist eigentlich nur ein einziger Assembler-Befehl das die praktisch jede FPU kennt.

Code:
math.h
#include <bits/mathcalls.h> 



mathcalls.h:

/* Exponential and logarithmic functions.  */

_Mdouble_BEGIN_NAMESPACE
/* Exponential function of X.  */
__MATHCALL (exp,, (_Mdouble_ __x));
Wenn man das weiterverfolgen will bis zum Assemblerbefehl, viel Spaß.
 

abgdf

Guru
Also, für math.h ergibt
Code:
rpm -qf /usr/include/math.h
daß diese Dateien zu "glibc-devel" gehören. Man müßte also den Source-Code von glibc (bzw. libstdc++) suchen; den gibt's hier.

Schau auch mal in glibc-html...rpm, vor allem hier.

Gruß
 

panamajo

Guru
Tooltime schrieb:
Wenn man das weiterverfolgen will bis zum Assemblerbefehl, viel Spaß.
AFAIK werden die meisten Floatingpoint Operationen unter x86 inzwischen via SSE abgearbeitet.

Abgesehen davon ist das so ein typisches Professoren Gedöns. Nur weil der mal (unterstellterweise vor 10 Jahren) irgendwo in einem C++ Header eine seiner Meinung nach nicht optimale Implementierung einer mathematischen Funktion gesehen hat ist C++ keine gute Sprache (war zu meiner Studienzeit so als den Anfangssemestern ein Prof unbedingt Modula2 als Sprache der Zukunft anpreisen wollte).

Wer bei der Vorlesung Compilerbau gut aufgepasst hat weiss dass dieses Argument Blödsinn ist da idealerweise auf Architekturebene der Compiler entscheidet welche Umsetzung effizienter ist.

Deshalb ist signifikant wie effiezient die mathematischen Operationen auf der jwlg. Plattform laufen und _nicht_ was die mathematisch einfachste Herleitung wäre.

Darin unterscheidet sich m.E. den Ansatz von Informatikern (halten Computer für ein Werkzeug das Ihnen einen frühen Feierabend verschafft) und Mathematikern (Kennen keinen Feierabend, wollen immer alles besser und genauer wissen, gehen damit allen auf den Sack). Da Mathematiker nicht kompatibel zur realen Wirtschaftswelt sind hat man sich entschlossen mit den Informatikern vorlieb zu nehmen, das klappt durch eigens geschulte PR Agenten einigermaßen. Das hindert Mathematiker natürlich nicht in Ihrem ihnen zugestandenen universitären Freigehege sinnfrei rumzublöken.
SCNR
 

Tooltime

Advanced Hacker
panamajo schrieb:
AFAIK werden die meisten Floatingpoint Operationen unter x86 inzwischen via SSE abgearbeitet.
Das kenne ich anders herum, da auf x86 die FPU grundsätzlich mit 80 Bit rechnet hätte man sonst eine geringere Genauigkeit bei float oder double. Nur ein Ergebnis das zurück in den Speicher geschrieben wird, wird auch in das Ursprungsformat gerundet, Zwischenergebnisse in der FPU behalten die 80 Bit. GCC hat zur Aktivierung der SSE-Einheit für normale FPU-Befehle den Schalter -mfpmath=unit, oder für Vektorbefehle spezielle interne Funktionen.
 
Oben