Vielen dank
1/1+1/2+1/3...+1/n kürzer schreiben
- 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
Ist es möglich in PB möglich 1/1+1/2+1/3+...+1/n kürzer zu schreiben?
Vielen dank
Vielen dank
"Ordnung braucht nur der Dumme, das Genie beherrscht das Chaos. "
Albert Einstein
Albert Einstein
Re: 1/1+1/2+1/3...+1/n kürzer schreiben
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
- 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
thx 
"Ordnung braucht nur der Dumme, das Genie beherrscht das Chaos. "
Albert Einstein
Albert Einstein
Re: 1/1+1/2+1/3...+1/n kürzer schreiben
Sorry, blödsinn. sum muss natürlich float sein. Hab's editiert.
Signatur und so
Re: 1/1+1/2+1/3...+1/n kürzer schreiben
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
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
Interessant.
Wie kann man Digamma() oder hyg3F2() mit PureBasic berechnen?
Wie kann man Digamma() oder hyg3F2() mit PureBasic berechnen?
Re: 1/1+1/2+1/3...+1/n kürzer schreiben
Ü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.
Ergebnis mit dem Code:
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))Wahres Ergebnis:2.9289682539682538
5.1873775176396206
7.4854708605503442
9.7876060360443837
23.603066594891992
230.83572496430611
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr