Ich implementiere momentan einige Funktionen, die es zwar schon gibt, aber nicht so, wie ich sie brauche. zB brauche ich einige Funktionen, die sowohl mit einfacher als auch mit doppelter Genauigkeit das gleiche machen, aber bislang nur mit doppelter Genauigkeit existieren (zB SinCos)
Das Problem: Die Funktionen (bzw bislang weiß ich´s erst von einer) funktionieren nicht. Und ich hab keine Ahnung, wie ich das beheben soll, weil mir fallt keine alternative Möglichkeit ein, das zu implementieren.
Meine Implementation von SinCos gibt immer 0.0 (für sinus und für cosinus) zurück (Math.SinCos kann ich nicht verwenden, weil das nur double nimmt)
Code:
procedure SinCos(phi: ftype; out sinus: ftype; out cosinus: ftype); //ftype wird definiert als single bzw double (mit $define) begin asm fld phi fsincos fstp cosinus fstp sinus end; end;
ich benutze FPC 2.2.4, für den Fall, dass das irgendwas zur Sache tut
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Da bist du wohl auf einen Compilerbug gestoßen, der auch bei FPC 2.4.2 noch drin ist. Das generierte ASM für deine sincos Funktion sieht so aus:
Code:
.section .text .balign 8,0x90 .globl P$FPUTEST_SINCOS$SINGLE$SINGLE$SINGLE .type P$FPUTEST_SINCOS$SINGLE$SINGLE$SINGLE,@function P$FPUTEST_SINCOS$SINGLE$SINGLE$SINGLE: .Lc1: # Temps allocated between rbp-24 and rbp-24 # [fputest.pas] # [8] begin pushq %rbp .Lc3: .Lc4: movq %rsp,%rbp .Lc5: subq $32,%rsp # Var phi located at rbp-8 # Var sinus located at rbp-16 # Var cosinus located at rbp-24 movss %xmm0,-8(%rbp) movq %rdi,-16(%rbp) movq %rsi,-24(%rbp) # [10] fld phi flds -8(%rbp) # [11] fsincos fsincos # [12] fstp cosinus fstpl -24(%rbp) # [13] fstp sinus fstpl -16(%rbp) # [15] end; leave ret .Lc2: .Le0: .size P$FPUTEST_SINCOS$SINGLE$SINGLE$SINGLE, .Le0 - P$FPUTEST_SINCOS$SINGLE$SINGLE$SINGLE
Wie man daraus unschwer(tm)* abliest, werden die werte zwar berechnet und auch vom FPU Stack geholt, aber dann nicht in die übergebenen Variablen geschrieben, sondern auf dem CPU Stack abgelegt. Dann wird die Funktion auch schon verlassen, sodass die da schön vor sich hingammeln.
Wenn man die Funktion so umschreibt geht es:
Code:
procedure SinCos(phi: Single; out sinus: Single; out cosinus: Single); var tcos, tsin: Single; begin asm fld phi fsincos fstp tcos fstp tsin end; sinus := tsin; cosinus := tcos; end;
Ich habe versucht, die Funktion mal als Assembly-Funktion zu schreiben. Dann beschwerte sich der assembler zurecht darüber, dass ich versuchte, 64bit Register an fstp und ein xmm register an fld zu übergeben… nunja, für weiteres war ich dann zu faul. Aber das wäre ein Ansatz, um die temporären Variablen zu umgehen.
greetings
*„unschwer“ ist kein eingetragenes Markenzeichen aller Mathematikvorlesenden dieser Welt.
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Meldest du den Bug oder muss ich das für dich machen?
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Wo meldet man solche Bugs, und was schreib ich in die Meldung rein (also, zB "Hallo Leute, ich hab einen Bug gefunden" wirds noch nicht wirklich bringen Also was (abgesehen vom code) muss da noch rein)?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
… http://bugs.freepascal.org Fehlerbeschreibung (Parameter werden nicht zugewiesen), Code und den ASM-Output den ich reingestellt habe, beides als Attachments (asm-output ist .s).
Auf keinen Fall höher als Minor bewerten. Gib deine FPC Version an, aber auch, dass das auf 2.4.2 getestet wurde und da immernoch besteht.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
ähm, ok. bin deinem Link gefolgt, finde aber nichts, wo ich eine Fehlerbeschreibung oder sonstwas raufladen kann. Auf der Seite sind zwar einige Links, aber keiner, der mir irgendwie so vorkommt (und die, die ich probiert hab, waren´s definitiv nicht), als ob ich da eine Fehlerbeschreibung reinstelen dürfte.
Zitat:
(asm-output ist .s)
Werde ich das noch verstehen, wenn ich die richtige Seite habe, oder sollte ich das schon jetzt verstehen, und hab aus einem anderen Grund keine Ahnung, was das heißt?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Natürlich musst du dich zum reporten registrieren. Mit dem .s war gemeint, dass der ASM-Output die Dateiendung .s haben sollte.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.