Kosinus-Abweichung

29/11/2009 - 13:59 von Markus Wichmann | Report spam
Hi all,

ich bin gerade dabei gewesen, den gcc gegen die dietlibc zu kompilieren,
da fiel mir auf, dass die libm der dietlibc auf x86_64 nicht sonderlich
reich bestückt ist.

So fehlt es zu allererst an einem Kosinus. Den hab ich wie folgt
implementiert:

bits 64
default rel
global cos:function (ende-cos), cosl:function (ende-cosl), cosf:function (ende-cosf)
;rationale: I could of course do something like
;movsd [rsp-8], xmm0
;But if a signal interrupted this function
;afterwards, my argument would be lost without me noticing it.
section .text
cos:
sub rsp, 8
movsd [rsp], xmm0
fld qword [rsp]
call cosb
fstp qword [rsp]
movsd xmm0, [rsp]
add rsp, 8
ret

cosf:
sub rsp, 4
movss [rsp], xmm0
fld dword [rsp]
call cosb
fstp dword [rsp]
movss xmm0, [rsp]
add rsp, 8
ret


cosl:
;nice ABI, ain't it? float and double get passed via xmm0
;only long double remains on the stack
fld tword [rsp+8]

cosb:
fcos
fnstsw ax
bt ax, 10
jnc .r
fldpi ; pi : x
fadd st0, st0 ; 2*pi : x
fxch ; x : 2*pi
.d: fprem1 ; smaller x : 2*pi
fnstsw ax
bt ax, 10
jc .d
fstp st1 ; smaller x
fcos ; cos(x)
.r: ret

ende:

Zum ABI-Test hab ich folgendes C-Programm nachgeschoben:


#include <math.h>
#include <stdio.h>

#ifndef ARG
#define ARG 1
#endif

int main()
{
printf("cos: %g", cos(ARG));
printf("cosf: %g", cosf(ARG));
printf("cosl: %Lg", cosl(ARG));
return 0;
}

So, dann habe ich das ganze kompiliert und gelinkt und siehe da: Wenn
ich kein ARG vorgebe, geben alle drei Funktionen das gleiche aus. Nun
hab ich aber mal mit '-DARG=tgamma(22)' kompiliert (d.h. das Argument
ist 21!). Und das hier war die Ausgabe:

cos: -0.728032
cosf: -0.256367
cosl: -0.728032

Ist der Fehler bei cosf ein Konversionsfehler beim Versuch 21! als float
darzustellen oder ein Darstellungsfehler oder ein Konversionsfehler bei
der Konversion des Kosinus in ein float?

Tschö,
Markus
Nur weil ein Genie nix reißt, muß ja nun nicht gleich jeder Idiot
pausieren... Bully hats ja auch geschafft.
 

Lesen sie die antworten

#1 Jan Seiffert
29/11/2009 - 15:42 | Warnen spam
Markus Wichmann schrieb:
Hi all,



[snip]

Ist der Fehler bei cosf ein Konversionsfehler beim Versuch 21! als float



Meinst du jetzt die Fakultaet?

http://de.wikipedia.org/wiki/Fakultàt_(Mathematik)
20! hat ja schon:
2.432.902.008.176.640.000
Ich glaub das passt nicht mehr in 32 Bit.

darzustellen oder ein Darstellungsfehler oder ein Konversionsfehler bei
der Konversion des Kosinus in ein float?

Tschö,
Markus


Gruss
Jan

Nur selten nimmt der Handelsmann statt baren Geldes Stuhlgang an

Ähnliche fragen