Grösser als unsigned long long?



  • Hallo liebes Forum,

    ich komme zu euch mit einem Problem, dass es bestimmt schon mal gab mir aber der richtige Suchbegriff ganz offensichtlich entfallen ist, da ich dazu nichts finde.

    Ich schreibe zurzeit an einer Mathe-Bibliothek/Paket. Bei Wahrscheinlichkeiten kommt diese leider an ihre Grenzen.

    Sowas wie 100! passt als nummerischer Wert leider nicht mehr in eine unsigned long long Variable 😞

    Mein Ansatz, um das Problem zu lösen, ist es mit einem char/byte-Array zu arbeiten. Was vorher z.B.

    long x = 100000;
    

    War wäre dann in dem neuen Format:

    char x* = "100000";
    

    Da ich dann sowas wie -,+,* und / selbst schreiben müsste und sämtlichen anderen mathematischen Formeln (Ganz zu schweigen von den Performance Verlusten).
    Wollte ich mich mal bei euch erkundigen, ob ihr mal auf ein solches Problem gestoßen seit - Im besten Fall wie Ihr dieses Problem gelöst habt und ob mein Ansatz vertretbar ist oder ob es vielleicht bessere und saubere Lösungen für mein Problem gibt 😃

    Ich danke schon mal im Voraus!

    Viele Grüße,
    Meeresgott





  • Danke! Auf dem ersten Blick sieht GMP genau nach dem aus, was ich gesucht habe.

    Da merkt man, googlen bringt nichts, wenn man es nicht richtig verwendet 😃

    LG



  • Das läuft unter dem Begriff "BigNum"



  • DirkB schrieb:

    Das läuft unter dem Begriff "BigNum"

    Ja habe ich jetzt auch raus (steht ja unter GMP).

    Komme aus dem Java Umfeld und habe verzweifelt nach etwas wie:

    "BigInt" in C o.ä. gesucht :p

    Aber GMP sieht stark nach einer Bib aus, die ich gebrauchen kann 😃

    Vielen Dank DirkB und wob 😃



  • Hallo!

    Zumindest wenn du Linux hast und mit gcc arbeitest, hast du eine Chance.
    Da kannst du libquadmath installieren.
    Beispiel:

    /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*-  */
    /*
     * main.c
     * Copyright (C) 2017 Fitje Weshoms (als Anagramm codierter Name)
     * 
     * quadmathtest is free software: you can redistribute it and/or modify it
     * under the terms of the GNU General Public License as published by the
     * Free Software Foundation, either version 3 of the License, or
     * (at your option) any later version.
     * 
     * quadmathtest is distributed in the hope that it will be useful, but
     * WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     * See the GNU General Public License for more details.
     * 
     * Bei Optionen konfigurieren : --enable-maintainer-mode 'CFLAGS=-g -O0' 'CXXFLAGS=-g -O0' 'JFLAGS=-g -O0' 'FFLAGS=-g -O0' 'CFLAGS=-lquadmath -O0' 
     * gcc7 muss installiert sein
     * You should have received a copy of the GNU General Public License along
     * with this program.  If not, see <http://www.gnu.org/licenses/>.
     */
    
    #include <quadmath.h>
              #include <stdlib.h>
              #include <stdio.h>
    
              int main ()
              {
                __float128 r;
                int prec = 20;
                int width = 46;
                char buf[128];
    
                r = 2.0q;
                r = sqrtq (r);
                int n = quadmath_snprintf (buf, sizeof buf, "%+-#*.20Qe", width, r);
                if ((size_t) n < sizeof buf)
                  printf ("%s\n", buf);
                  /* Prints: +1.41421356237309504880e+00 */
                quadmath_snprintf (buf, sizeof buf, "%Qa", r);
                if ((size_t) n < sizeof buf)
                  printf ("%s\n", buf);
                  /* Prints: 0x1.6a09e667f3bcc908b2fb1366ea96p+0 */
                n = quadmath_snprintf (NULL, 0, "%+-#46.*Qe", prec, r);
                if (n > -1)
                  {
                    char *str = malloc (n + 1);
                    if (str)
                      {
                        quadmath_snprintf (str, n + 1, "%+-#46.*Qe", prec, r);
                        printf ("%s\n", str);
                        /* Prints: +1.41421356237309504880e+00 */
                      }
                    free (str);
                  }
                return 0;
              }
    

Anmelden zum Antworten