Laden...

Fakultät von Int wird bei 22 negativ, dann wieder positiv

Erstellt von NiggiBS vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.717 Views
N
NiggiBS Themenstarter:in
17 Beiträge seit 2016
vor 8 Jahren
Fakultät von Int wird bei 22 negativ, dann wieder positiv

Ich habe aus Langeweile ein kleines Programm geschrieben (C#-Konsolenprogramm ohne GUI), das die Fakultät (1234 ... *n) einer eingegebenen Zahl errechnet.
Zuerst habe ich die resultierende Zahl in einer Variable vom Typ "int" gespeichert. Da die Fakultät einer Zahl sehr schnell sehr gross werden kann war das aber natürlich die falsche Wahl. Ich habe mich dann für "double" entschieden.
Mir ist nun aufgefallen, dass ich, als die Zahl noch als "int(32)" gespeichert wurde, keine fehlermeldung o.Ä. bekommen habe. Allerdings passierte folgendes: bei der Zahl 22 wurde mir eine ziemlich hohe negative Zahl ausgegeben; bei 23 ab 23 wurde die Zahl wieder positiv, war aber nicht korrekt. Hat wer ne Idee, wieso das so ist, bzw. wie die Zahl abgespeichert wird, wo doch die Variable zu klein ist?

Hier der Code:
(fakultät ist die besagte Variable)

        static void fakultät_rechner(int eingabe)
        {
            for(int i = 1; i <= eingabe; i++)
            {
                fakultät *= i;               
            }
            Console.Write("!{0} = {1}", eingabe, fakultät);
            Console.ReadLine();
        }

S
248 Beiträge seit 2008
vor 8 Jahren

22! viel größer als Int32.MaxValue (2^31-1)
Daher hast du Überläufe vom Positiven ins Negative und wieder zurück.

Mit BigInteger sollte es gehen.

185 Beiträge seit 2005
vor 8 Jahren

Das kommt daher, da das höchstwertigste Bit bei Int das Vorzeichen darstellt.
Wenn du UInt nimmst, hast du das Vorzeichen nicht, da hättest du keinen negativen Wert bekommen.
Wenn die Zahl zu groß wird, hast du einen Überlauf, dann stimmt das Ergebnis nicht mehr.

3.003 Beiträge seit 2006
vor 8 Jahren

Die Gründe für das Verhalten wurden ja bereits erklärt (siehe auch: Arithmetischer Überlauf)

Noch kurz was zu deinem Code: es mag nur eine Kleinigkeit sein, aber solang du die Sprache kennenlernst und herumprobierst, tust du dir selbst einen großen Gefallen, wenn du dir eine durchgehende, einheitliche Syntax angewöhnst. Es gibt dafür in C# Konventionen: [Artikel] C#: Richtlinien für die Namensvergabe (das hilft auch anderen, deinen Code schneller zu verstehen). Umlaute solltest du ganz weglassen 😃.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

N
NiggiBS Themenstarter:in
17 Beiträge seit 2016
vor 8 Jahren

Danke an alle 🙂

Ich nehme nun bei der besagten Methode den Typ "double".
Damit habe ich keine Überläufe mehr.
Nur bei sehr grossen Zahlen heisst es dann "+unendlich" 😁