Newsgroup: it.comp.lang.c++
Titolo: ! Variabili ????

Salve,
Allora un int va da -32768 a +32767, longint e' decisamente piu' grande, ma
a volte non abbastanza!
Come faccio ad avere, diciamo, una variabile che accetta numeri anche di 25
cifre???
E' possibile? Se non lo e' che trucco devo addottare?
Vi ringrazio anticipatamente,
Tommy
spac...@tin.it

Per avere un nuovo tipo di dato in grado di gestire i 'grandi numeri'
devi farti una classe a parte. Probabilmente, però, queste classi le
trovi anche in rete.
Se ti accontenti di codice C, puoi prendere gli "Snippets" di Bob Stout
( 
http://www.brokersys.com/snippets/
 ) e guardare alla sezione "Cliff
Rhodes' package of unsigned integer math for arbitrarily large numbers":
 
http://www.brokersys.com/snippets/#section1group10
Non l'ho mai utilizzata, ma penso che possa comunque essere un buon
punto di partenza. Inoltre, il codice è comunque direttamente
utilizzabile in un programma C++, oltre al fatto di poter essere
liberamente utilizzato essendo Public Domain (se non sbaglio!).
Per inciso, un altro programma in cui vengono utilizzati numeri grandi a
piacere lo trovi (pagina base: 
http://www.ioccc.org/years.html
 )
all'indirizzo:
 
http://www.ioccc.org/1995/savastio.c
Quando l'hai provato... dimmi se ti è piaciuto!!!
Se invece non ti importa niente di utilizzare C++, ma vuoi solo
risolvere il problema, puoi provare a vedere se le classi Java per il
trattamento dei 'grandi numeri' ti soddisfano.
Saluti,
        Flavio.
--
Flavio Poletti
e-mail:   
pol...@writeme.com
web page: 
http://poletti.freeweb.org/
La libertà [americana] è lì, alla portata di tutti...
     ... come la chitarra ....
... ognuno suona come vuole ...
     ... e tutti suonano come vuole la libertà!
                                  (G. Gaber)

E' possibile? Se non lo e' che trucco devo addottare?
Esiste un intero a 64 bit e funzioni matematiche che supportano questo tipo
di dato, questo intero é:
    __int64 (due underscore in testa).
Inoltre in "WinNT.h" sono poi definiti:
    typedef __int64 LONGLONG;
    typedef unsigned __int64 DWORDLONG;
Purtroppo però con questo "size", si ottengono numeri fino a 19 cifre decimali:
    log( 2 ^ 64 ) = 19.2659 ............. (cifre decimali)
Non sono a conoscenza di interi più grandi già implementati, di conseguenza,
per raggiungere le 25 cifre decimali, dovrai eseguire le tue operazioni su 3
longword concatenate:
typedef struct _INT96
{
    DWORD LowPart;
    DWORD MidPart;
    LONG HighPart;
} INT96;                      // con segno
typedef struct _UINT96
{
    DWORD LowPart;
    DWORD MidPart;
    DWORD HighPart;
} UINT96;                   // senza segno
Solo per farti un esempio, in una addizione, cominci a sommare le LowPart
dei due operandi, poi le MidPart più l'eventuale riporto delle LowPart e infine
le HighPart più l'eventuale riporto delle MidPart.
Ti conviene creare un parco funzioni per tutti i tipi di operazioni matematiche
di cui hai bisogno e poi implementarle in assembler (in modo da poter gestire
il flag di carry).
Per completezza: log( 2 ^ 96 ) = 28.8988 ............. (cifre decimali)
Saluti, Neil

E' possibile? Se non lo e' che trucco devo addottare?
Esistono, in rete, classi che implementano l'aritmetica a precisione
variabile (sia solo per interi, sia per generiche frazioni, ecc).  Non
ho un'URL sotto mano, ma e` questo tipo di cose che devi cercare.
Alex