Seite 1 von 1

1/1+1/2+1/3...+1/n kürzer schreiben

Verfasst: 13.08.2014 14:29
von Purebasium
Ist es möglich in PB möglich 1/1+1/2+1/3+...+1/n kürzer zu schreiben?

Vielen dank :allright:

Re: 1/1+1/2+1/3...+1/n kürzer schreiben

Verfasst: 13.08.2014 14:51
von Derren

Code: Alles auswählen

Define sum.f ;Ergebnis der Summe
Define N.i = 99 
Define i.i ;Summenindex

For i=1 to N
 sum + (1/i)
Next
Debug sum

Re: 1/1+1/2+1/3...+1/n kürzer schreiben

Verfasst: 13.08.2014 14:53
von Purebasium
thx :bounce:

Re: 1/1+1/2+1/3...+1/n kürzer schreiben

Verfasst: 13.08.2014 14:55
von Derren
Sorry, blödsinn. sum muss natürlich float sein. Hab's editiert.

Re: 1/1+1/2+1/3...+1/n kürzer schreiben

Verfasst: 19.08.2014 17:31
von hyperG
Bei sehr großen n sollte man statt der Summe die schnelleren Algorithmen verwenden:
HarmonZahl(n) = Digamma(n+1) + A001620
= n * hyg3F2(1,1,1,1-n,2,2,1)
So bekommt man für n= 9999999999999999
in ms das Ergebnis 37.4185771528062637548943753650322289...
Mehr zum Umkehrfunktionenrechner unter http://www.lamprechts.de/gerd/php/Rechn ... nktion.php

Re: 1/1+1/2+1/3...+1/n kürzer schreiben

Verfasst: 23.08.2014 20:42
von Nino
Interessant.

Wie kann man Digamma() oder hyg3F2() mit PureBasic berechnen?

Re: 1/1+1/2+1/3...+1/n kürzer schreiben

Verfasst: 25.08.2014 13:11
von STARGÅTE
Über Näherungsformeln ...
Dort hast du aber wieder das "Problem" dass du nur eine Näherung bekommst,
die je nach Berechnungsaufwand nur eine bestimmte genauigkeit hat und
vllt auch noch nur für bestimmte n's gut ist (n>1000 z.B.)

Zudem müsstest du für deinen Ziel auch eine Fallunterscheidung vornehmen.
Wenn n = 3 ist, so wäre es viel schnell 1/1+1/2+1/3 zu berechnen, als eine Formel zu nutzen.

Hier mal der Code von mir, der in der Genauigkeit von Doubles gute Ergebnisse liefert:
Auch hier habe ich Fallunterscheidungen drin. Zum einen wegen der Laufzeit, zum anderen wegen der Genauigkeit.
Wird die Zahl groß, dann liegen bestimmte Potenzen außerhalb der Genauigkeit und liefern damit eh kein Beitrag mehr.
Theoretisch könnte man noch zwei weitere Abfragen einbauen, da für gigantische Zahlen nur noch #EulerMascheroni+Log() reicht.

Code: Alles auswählen

#EulerMascheroni = 0.5772156649015328607
Procedure.d HarmonicNumber(Value.d)
	Protected I.i, Result.d
	If Value < 50 And Mod(Value, 1) = 0
		For I = 1 To Value
			Result + 1/I
		Next
		ProcedureReturn Result
	ElseIf Value < 200
		ProcedureReturn #EulerMascheroni + Log(Value) + 1/(2*Value) - 1/(12*Value*Value) + 1/(120*Value*Value*Value*Value) - 1/(252*Pow(Value,6)) + 1/(240*Pow(Value,8))
	ElseIf Value < 3100
		ProcedureReturn #EulerMascheroni + Log(Value) + 1/(2*Value) - 1/(12*Value*Value) + 1/(120*Value*Value*Value*Value) - 1/(252*Pow(Value,6))
	ElseIf Value < 3e7
		ProcedureReturn #EulerMascheroni + Log(Value) + 1/(2*Value) - 1/(12*Value*Value) + 1/(120*Value*Value*Value*Value)
	Else
		ProcedureReturn #EulerMascheroni + Log(Value) + 1/(2*Value) - 1/(12*Value*Value)
	EndIf
EndProcedure

Debug HarmonicNumber(10)
Debug HarmonicNumber(100)
Debug HarmonicNumber(1000)
Debug HarmonicNumber(10000)
Debug HarmonicNumber(Pow(10,10))
Debug HarmonicNumber(Pow(10,100))
Ergebnis mit dem Code:
2.9289682539682538
5.1873775176396206
7.4854708605503442
9.7876060360443837
23.603066594891992
230.83572496430611
Wahres Ergebnis:
2.9289682539682539682539682539
5.18737751763962026080511767566
7.48547086055034491265651820433390018
9.787606036044382264178477904851605335
23.6030665948919897007855933035927
230.83572496430610126240565755852