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

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Purebasium
Beiträge: 74
Registriert: 05.02.2014 22:08
Computerausstattung: Ein Computer halt.
Mit Windows 7
und mit AMD Phenom(tm) II X4 B50 Prozessor
und einer ATI Radeon HD 5450 Grafikkarte
Wohnort: Mars, Kraterstr. 57b, Apartment 7

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

Beitrag 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:
"Ordnung braucht nur der Dumme, das Genie beherrscht das Chaos. "
Albert Einstein
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

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

Beitrag 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
Zuletzt geändert von Derren am 13.08.2014 14:54, insgesamt 1-mal geändert.
Signatur und so
Benutzeravatar
Purebasium
Beiträge: 74
Registriert: 05.02.2014 22:08
Computerausstattung: Ein Computer halt.
Mit Windows 7
und mit AMD Phenom(tm) II X4 B50 Prozessor
und einer ATI Radeon HD 5450 Grafikkarte
Wohnort: Mars, Kraterstr. 57b, Apartment 7

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

Beitrag von Purebasium »

thx :bounce:
"Ordnung braucht nur der Dumme, das Genie beherrscht das Chaos. "
Albert Einstein
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

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

Beitrag von Derren »

Sorry, blödsinn. sum muss natürlich float sein. Hab's editiert.
Signatur und so
hyperG
Beiträge: 23
Registriert: 28.06.2014 10:43

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

Beitrag 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
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

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

Beitrag von Nino »

Interessant.

Wie kann man Digamma() oder hyg3F2() mit PureBasic berechnen?
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten