GroßeZahlen ind C
-
Hallo,
hab ein Problem und zwar weiss ich nicht wie ich mit Zahlen der Länge 10^2564 umgehen soll. Kann man damit überhaupt in c rechnen ?
Aufgabe ist es die "ersten " 500 Glieder der Sinusreihe auszugeben.[cpp]#include <stdio.h>
#include <math.h>int fac(int n)
{
int fac=1;
while (n>0)
{
fac=fac*n;
n--;
}
return fac;
}int sinusreihe (int x)
{
int k = 1,vz=1,numerator=1 ,denominator=1 ,sum=1,tmp=0 ;
printf("Wert von k %d\n",k);//Test mit 10 Gliedern
while (k!=10)
{
vz = pow(-1,k);
numerator = pow(x,2k+1);
denominator = fac(2k+1);
printf("Wert der inneren Variablen: %d\n",k);
sum = (vz*(numerator/denominator))+sum;
k++;
}
return sum;}
int main(void)
{
int i,f;
int z=sinusreihe(4);
printf ("wert des 500 Elements %d \n",z);
//printf ("Wert fakultaet %d \n",f);
scanf("%d", &i) ;
return 0;
}274463 entries in database[cpp]
-
siehe GMP
-
Hallo lexxw,
lexxw schrieb:
Aufgabe ist es die "ersten " 500 Glieder der Sinusreihe auszugeben.
Was ist mit dieser Aufgabenstellung wirklich gemeint?
So wie ich es verstehe, gegeben ist eine Zahl x und die Ausgabe des
Algorithmusses ist die Taylorentwicklung von sin (Sinusreihe) bis
zum 500sten Glied berechnet. Niemand sagt, dass du dabei rießige
Zahlen benötigst.Du kannst bestimmt mt Zwischenergebnissen weiterrechnen.
Z.B. berechne doch einfach x*x/2 *x/3 ... und so weiter.Wie das jetzt mit der Genauigkeit ist, weiß ich nicht. Das müßtest
du dann vorher analysieren.Gruß mcr
PS: wie gesagt, das ist mal so ein Gedanke, noch nicht bis zum Ende
durchdacht.
-
Dank für die schnellen Antworten .
@rüdiger:"GMP" Wöfür steht die Ankürzung ?
@mcr
Die Aufgabe lautet eigentlich jedes 10te Glied auszugeben dis zum 500ten,das
Program sollte für mich nur das Grundgerüst darstellen."Z.B. berechne doch einfach x*x/2 *x/3 ... und so weiter."
Aber irgendwann muss ich doch auch die Fakultät von 499+500 in C berechnen
um das 500 Glied ausgeben zu können.
-
Hallo,
nur das du wenn du 500! berechnet auch pow(x,500) berechnest.
da gehört ja irgendwie zusammen, warum dann nicht so etwas wie
ich in meinem letzten Post vergeschlagen habe:pow(x,500) = x*x*x*x*x*x*...*x 500! = 1*2*3*4*5*6*...*500
Mit ein wenig Mathe wird daraus dann:
pow(x,500)/500! = x/1 * x/2 * x/3 * x/4 * x/5 * ... * x/500
Und diese Vorgehensweise musst du dann für jedes Glied machen
und addieren (bzw. hier dann ein wenig optimieren ;-))Gruß mcr
PS: oops, ich glaube, dieses Glied gibt es jetzt nicht in der
Reihe
-
Und du solltest vor allen Dingen einen geeigneten Datentyp verwenden (mit int kommst du da nicht weit).
-
Und du solltest vor allen Dingen einen geeigneten Datentyp verwenden (mit int kommst du da nicht weit).
Jepp, genau das meinte ich mit:
Wie das jetzt mit der Genauigkeit ist, weiß ich nicht. Das müßtest
du dann vorher analysieren.
-
@rüdiger:"GMP" Wöfür steht die Ankürzung ?
Kleiner Scherz? http://www.google.at/search?hl=de&q=gmp+c&btnG=Suche&meta=
Nachdem dich aber der Forschergeist treibt und du nur wenige Rechenoperationen brauchst: nämlich 1 substrahieren, potenzieren und dividieren mit ganzzahligem Exponenten/Nenner; könntest du die auch als Makros für n-Byte-Felder definieren, indem du über die Bytes iterierst, die integer-Rechenoperationen verwendest und auf den Überstand achtest.