Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Loch 12

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
21.07.2003, 01:53 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Weil mir kein besseres Rätsel eingefallen ist...
analog zur aufgabe mit dem sinus(also nur die grundrechenarten sind erlaubt) ist folgende funktion zu schreiben

C++:
double ln(double x);



es gilt folgendes:
ln(1+y)= y/1 - y*y/2 + y*y*y/3 - y*y*y*y/4 + y*y*y*y*y/5 ....
für -1<y<=1

Dabei sollte man noch folgendes beachten: Weil im Nenner keine Fakultät steht konvergiert das ganze nicht so schnell. Um trotzdem hinreichend grosse Genauigkeit zu erreichen sollte man das ganze in der Nähe von y=0 entwicken weil einem dass sonst bei z.B. ln(100000000) wegläuft. Will heissen man braucht zu viele Glieder (fast unendlich) der Kette um eine hinreichende Genauigkeit zu erreichen.

Für die die es nicht wissen: ln(a*b) = ln(a)+ln(b)

Da ichs selber noch nicht geproggt hat sag ich mal zunächst Par=180, vermute aber mal das das auch mit deutlich weniger gehen wird.
Viel Spass

Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.07.2003, 09:40 Uhr
daredevil
Speicherteufel


Hallo!
ich dachte man berechnet ln von x??
oder wofür ist y auf einmal?
--
tschüss,
DareDevil

Dieser Post wurde am 21.07.2003 um 09:58 Uhr von daredevil editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.07.2003, 09:58 Uhr
0xdeadbeef
Gott
(Operator)


Hübsche 109.

C++:
double ln(double x){double r=0,t=x-1,i=0;if(x>2)return ln(2)+ln(x/2);for(;++i<99999;t*=1-x)r+=t/i;return r;}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.07.2003, 11:31 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@beefy
gerade mal 9:58 und du hast das schon gelöst? enweder schläfst du vorm rechner oder du bist kein echter Student?
Ich bin mal wieder gerade eben erst aufgestanden

fast genau so wie du hatte ichs auch erst (mal von den variablennamen abgesehen)

aber lass dir mal das ausgeben

C++:
printf("%0.12f\n",ln(1.0/100000000));



da kommt dann ziemlicher schrott raus weil du um um 2 entwickelst

ich versuche gerade sowas in der art klein zu bekommem

C++:
double ln(double x){
    if(x>1.25)return-ln(1/x);
    if(x<0.8)return ln(0.8)+ln(x/0.8);
    double i=1,s=--x,y=x;
    for(;++i<99;s+=y/i)y*=-x;
    return s;
}



Gruss Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 21.07.2003 um 11:34 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.07.2003, 11:33 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@daredevil
Ich habe das mal y genannt weil du vom x erst noch 1 abziehen musst (somit sind x und y verschieden. Ich habe eigentlich extra anders benannt um verwirrungen zu vermeiden. Anscheinend hab ich das gegenteil erreicht

Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.07.2003, 11:42 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


hatte ich ganz vergessen zu sagen
so ist deine funktion noch ein bisschen kürzer

C++:
double ln(double x){double r=0,t=x-1,i=0;if(x>2)return-ln(1/x);for(;++i<99999;t*=1-x)r+=t/i;return r;}


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.07.2003, 11:57 Uhr
0xdeadbeef
Gott
(Operator)


OK, einen hab ich noch. Ein bisschen kürzer, aber auch langsamer:

C++:
double ln(double x){double r=0,t=x-1,i=0;for(;++i<99999;t*=1-x)r+=t/i;return x>2?-ln(1/x):r;}


93 Zeichen und ein newline. Schick, was?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.07.2003, 12:05 Uhr
0xdeadbeef
Gott
(Operator)


Und weils so schön war, nehmen wir noch ein Zeichen raus:

C++:
double ln(double x){double r=0,t=-1,i=0;for(;i<99999;r+=t/++i)t*=1-x;return x>2?-ln(1/x):r;}


Noch zwei Zeichen, und ich hab die Hälfte von Par Ich glaube, bei diesem Parcour wäre Par 100 deutlich besser angebracht gewesen...
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 21.07.2003 um 12:06 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.07.2003, 12:08 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


und hast du auch schon ne Lösung für das Genauigkeitsproblem. also wie man meinen sch**ss noch kürzer kriegt?

Ich habe bei dem was ich dir oben gepostet habe keine wirkliche Idee mehr.
Auf jeden Fall geht das golfen diesmal stark auf die performance

Gruss Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 21.07.2003 um 12:08 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.07.2003, 14:08 Uhr
daredevil
Speicherteufel


hallo


C++:
main(){int i,o,j,k=-1,z;double s;scanf("%d",&z);z--;for(i=1,s=z;i<10000;i++){for(j=i,o=z;j>0;j--)o*=o;s+=(k*(o/(i+1)));k*=-1;}printf("%lf",s);}



kann mir jemand sagen, was da dran falsch ist?
--
tschüss,
DareDevil
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: