Schrift
[thread]12102[/thread]

Euleresche Zahl Berechnen, mit vielen Nachkommastellen.

Leser: 2


<< >> 9 Einträge, 1 Seite
Gast Gast
 2008-06-29 15:35
#111649 #111649
Hallo,
kann mir jemand helfen, will die euleresche Zahl berechnen, wie kann ich das machen. e hat ja unendlich viele Nachkommazahlen. will ein programm mit perl schreiben wo ich sagen kann wieviel nachkommastellen ich haben will und das programm dann eine Näherung an e errechnet und dann via print $eu ausgibt!
Danke
#Kein Kommentar
 2008-06-29 18:24
#111658 #111658
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
vielleicht sind ein paar funktionen aus den modulen der CPAN:Math::BigFloat - familie ganz interessant?
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
FoolAck
 2008-06-29 18:58
#111661 #111661
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Hier hab ich die Formel zur Berechnung her. Und da ich mich sowieso schon länger mal mit BigFloat auseinandersetzen wollte:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env perl
use strict;
use warnings;
use Math::BigFloat;

Math::BigFloat->accuracy(100);  # default to 100 digits after the decimal dot

my $e = Math::BigFloat->bone();
my $fakulty = $e->copy();
my $tmp;

for my $n (1 .. 10) {
    $fakulty->bmul($n);
    $tmp = $fakulty->copy()->bpow(-1);
    $e->badd($tmp);
    print "$e\n";
}

Und wo wir grade dabei sind, kann mir einer sagen, warum ich da die $tmp Variable brauche? Also warum geht das nicht so:
Code (perl): (dl )
1
2
3
4
5
for my $n (1 .. 10) {
    $fakulty->bmul($n);
    $e->badd($fakulty->copy()->bpow(-1));
    print "$e\n";
}
?
moritz
 2008-06-29 20:16
#111663 #111663
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
FoolAck+2008-06-29 16:58:41--
Und wo wir grade dabei sind, kann mir einer sagen, warum ich da die $tmp Variable brauche?


Vermutlich weil Ranges nicht überladbar sind.

Übrigens versteht dich kein Brite oder Ami, wenn du $fakulty schreibst. Wenn du die Fakultät meinst, solltest du $factorial schreiben.
FoolAck
 2008-06-29 20:53
#111664 #111664
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Wenn überhaupt, dann sowieso mit "c". Tja, mit "Mathe-Englisch" hab ichs nicht so...
Da hab ich in Deutsch teilweise schon Probleme.

Was du mit "Ranges sind nicht überladbar" meinst, versteh ich nicht.
Könntest du das erläutern?
1. sehe ich hier keine Range. (Der Ausdruck $fakulty->copy()->bpow(-1) liefert ja exakt einen Wert zurück, und nicht irgendwie einen Wertebereich oder so...)
2. Was wird hier wo überladen?

(Sorry fürs Thread-Karpern, aber interessiert mich jetzt mal.)
moritz
 2008-06-29 21:28
#111668 #111668
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
FoolAck+2008-06-29 18:53:08--
Was du mit "Ranges sind nicht überladbar" meinst, versteh ich nicht.
Könntest du das erläutern?
1. sehe ich hier keine Range. (Der Ausdruck $fakulty->copy()->bpow(-1) liefert ja exakt einen Wert zurück, und nicht irgendwie einen Wertebereich oder so...)
2. Was wird hier wo überladen?


2. Diverse Operatoren in den big*-Modulen.

1. In for $n (1..10) ist 1..10 ein Range.
bigint.pm (und vermutlich auch BigFloat und andere Mathe-Pakete) überladen Operatoren, um aus "normalen" Zahlen "große" zu machen. Da aber der Range-Operator nicht überladbar ist, ist im obigen Bespiel $n eine "gewöhnliche" Zahl, keine "große".

Beispiel mit bigint:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl
use strict;
use warnings;
use bigint;

for (1e9..1e9){
    print $_ * $_, $/;
}
my $x = 1e9;
print $x * $x, $/;
__END__
1e+18
1000000000000000000


Obwohl die beiden Multiplikationen eigentlich das gleiche tun sollten, hat die erste normale Semantik und die zweite bignum-Semantik
FoolAck
 2008-06-30 12:27
#111675 #111675
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Naja, das mag stimmen für die "big(?:int|rat|num)" Module, aber diese sind ja letztlich nur wrapper/Frontend Module für Math::BigInt/Math::BigFloat etc., wobei sie halt noch zusätzlich Operatoren überladen. Aber ich hab ja Math::BigFloat direkt benutzt. Das Modul läd afaik nichts über. BigFloats sind dann halt spezielle Objekte. Wie du siehst benutz ich ja auch die Objekt-Methoden für normale Rechenarten.
Code (perl): (dl )
1
2
3
4
use Math::BigFloat;
my $bigFloatNum = Math::BigFloat->new(5); # erstellt eine bigfloat mit "startwert 5"
$bigFloatNum->badd(10); # jetzt ist $bigFloatNum eine BigFloat mit dem Wert 15
print "bigFloatNum = $bigFloatNum\n";

Sprich: Die Argumente zu den BigFloat Rechenfunktionen müssen (können afaik aber) selbst keine BigFloats sein. Und innerhalb der Schleife ist $_ ja einfach nur ne normale Zahl (Skalar im numerischen Kontext.).
Die Frage nach der Notwendigkeit der $tmp Variable bleibt also imho bestehen.
Gast Gast
 2008-06-30 17:41
#111700 #111700
Was funktioniert denn nicht an der Variante ohne $tmp?
Bei mir kommt bei 10 Durchläufen folgendes Ergebnis, ohne $tmp:
Code: (dl )
2.718281801146384479717813051146384479717813051146384479717813051146384479717813051146384479717813053

MfG
betterworld
 2008-06-30 18:01
#111701 #111701
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
moritz+2008-06-29 19:28:20--
bigint.pm (und vermutlich auch BigFloat und andere Mathe-Pakete) überladen Operatoren, um aus "normalen" Zahlen "große" zu machen.

Sorry, will keine Erbsen zählen, aber wenn ich das richtig verstanden habe, ist es so:
Die Operatoren werden von Math::BigInt überladen. bigint hingegen überlädt auf noch magischere Weise die Zahlenliterale, sodass jede Zahl im Quelltext automatisch mit Math::BigInt->new erzeugt wird. Oder so.
<< >> 9 Einträge, 1 Seite



View all threads created 2008-06-29 15:35.