Periodico

di il
14 risposte

Periodico

Salve a tutti
sto implementando una classe numerica
ma purtroppo ho il problema della divisione
il problema sta nel fatto che non so come calcolare la periodicità del numero.
se qualcuno ha una idea sul come fare gliene sarei molto grato.

14 Risposte

  • Re: Periodico

    Cioè?
  • Re: Periodico

    Per esempio
    13/9 =1,3(periodico)
    oppure 31/7=4,(714285)periodico
    ecco a cosa mi riferisco
  • Re: Periodico

    Quello l'avevo capito ma non si capisce il problema quale sia ...
  • Re: Periodico

    Il problema consiste
    come posso far capire alla funzione che la divisione stà generando un numero periodico e quindi si deve fermare ?
    altrimenti mi riempie tutto il campo con cifre ripetute il che non sarebbe molto funzionale.
    non credi?
  • Re: Periodico

    Ma la tua funzione avrebbe sicuramente un numero finito di decimali da utilizzare quindi non vedo problemi
  • Re: Periodico

    Le divisioni in virgola mobile in C++ come in C, come in qualsiasi altro linguaggio anche se alcuni lo nascondono al programmatore (vedesi python) vengono fatte attraverso un circuito particolare della ALU che si occupa di fare i calcoli in virgola mobile. detto ciò tu puoi usare double o float per fare questi calcoli (doppia o singola precisione) in entrambi i casi esistono dei numeri massimi di cifre decimali che puoi usare. quindi qualsiasi cosa tu faccia il calcolatore si fermerà dopo aver calcolato questo numero di cifre.

    in ogni caso se stai tentando di fare una classe numerica efficiente, ti consiglio di mantenere in memoria i numeri come delle frazioni, e di convertirli in numeri decimali, solo nel momento in cui devi stamparli, questo a mio avviso ti permetterebbe di memorizzare numeri con precisioni nettamente maggiori ed inoltre eliminerebbe il problema sul nascere dato che non ti servirebbe più fare il calcolo dato che in memoria memorizzi due interi (o due float a tua scelta) che vengono divisi tra loro solo quando vengono stampati e a quel punto la precisione la scegli tu.

    Inoltre in questo modo puoi implementare la divisione usando solo la moltiplicazione, metti infatti di avere due numeri (a/b) e (c/d) che devono essere divisi tra loro allora moltiplichi (a/b)(d/c) ed ottieni sempre un numero che sarà (ad/bc). In questo modo elimini il problema del calcolo del numero periodico.
  • Re: Periodico

    oregon ha scritto:


    Ma la tua funzione avrebbe sicuramente un numero finito di decimali da utilizzare quindi non vedo problemi
    certo che avrebbe un numero finito di decimali ma perchè farglieli usare tutti quando magari già al primo becco un periodico?
    e poi se glieli faccio calcolare tutti sarebbe un pò lenta visto che il numero può contenere massimo 87 decimali
    e poi alla fine comunque dovrei levare la periodicità perchè non sarebbe professionale.
    quindi se riesco a "fermarlo" in tempo mi "risparmierei" il lavoro alla fine.
    cosi credo che la routine sia più veloce e sicuramente e più performante rispetto a quella che leverebbe la periodicita alla fine.

    Nosba ha scritto:


    Inoltre in questo modo puoi implementare la divisione usando solo la moltiplicazione, metti infatti di avere due numeri (a/b) e (c/d) che devono essere divisi tra loro allora moltiplichi (a/b)(d/c) ed ottieni sempre un numero che sarà (ad/bc). In questo modo elimini il problema del calcolo del numero periodico.

    sinceramente non ho capito potresti spiegarmi meglio facendo qualche esempio
  • Re: Periodico

    smalldragon ha scritto:


    perchè farglieli usare tutti
    Ma perché, si consumano? Che senso ha quello che dici? Un valore in virgola mobile occupa un numero fisso di byte a prescindere dal numero di decimali utilizzati.
    e poi se glieli faccio calcolare tutti sarebbe un pò lenta visto che il numero può contenere massimo 87 decimali
    87 cifre decimali ?

    Ma quindi parli di una tua libreria non di operazioni su valori fp standard
    e poi alla fine comunque dovrei levare la periodicità perchè non sarebbe professionale.
    Non vedo cosa c'entri la professionalità ... comunque non penso si possa determinare facilmente il periodo. E poi sarebbe difficile esprimerlo ed utilizzare questa informazione in seguito.
  • Re: Periodico

    Secondo me quello che dici non ha senso, non alleggeriresti il programma anzi lo complicheresti...
    prova a pensare: se lui fa il suo bel conticino con tutti i numeri decimali, questo conto viene fatto in hardware come ho detto prima ed è il massimo della velocità ottenibile. Ammettendo che trovi un metodo per capire se una divisione porta ad un numero periodico, comunque dovresti fare in modo che il tuo computer effettui molti calcoli per eseguire questo ipotetico algoritmo. Quindi sprecheresti memoria ed istruzioni per fare una cosa che è fondamentalmente inutile.

    per quanto riguarda ciò che intendevo io è: hai detto che stai scrivendo una classe che possa rappresentare dei numeri. Se al posto di memorizzare il numero in una proprietà di questa classe, lo memorizzi usando due proprietà: il numeratore ed il denominatore, ti trovi ad avere una classe estremamente più efficiente e comoda per maneggiare sia numeri molto grandi che numeri molto piccoli che periodici poiché potresti tenere sempre la rappresentazione come frazione durante i conti.
  • Re: Periodico

    Dipende dalla complessita dell'algoritmo.
    miè venuta un idea per calcolare il periodico quello semplice esempio 13/9 = 1,3(periodico)
    in questo caso se il resto delle ultime 2 operazini, nella fase di calcolo dei decimali, è uguale allora terminerebbe il calcolo.
    che ne pensate ?
    credo che in casi come quello dell'esempio otterei un bel risparmio sia in termini di bit utilizzati che in cicli macchina.
    per gli altri casi di periodicità credo che li dovrò risolvere alla fine visto che non mi viene altro in mente.

    Nosba ha scritto:


    per quanto riguarda ciò che intendevo io è: hai detto che stai scrivendo una classe che possa rappresentare dei numeri. Se al posto di memorizzare il numero in una proprietà di questa classe, lo memorizzi usando due proprietà: il numeratore ed il denominatore, ti trovi ad avere una classe estremamente più efficiente e comoda per maneggiare sia numeri molto grandi che numeri molto piccoli che periodici poiché potresti tenere sempre la rappresentazione come frazione durante i conti.
    ottima idea considerare anche le funzioni
  • Re: Periodico

    La periodicita' di un numero e' una caratteristica che puo' essere dedotta mediante i teoremi della teoria dei numeri
    In particolare:

    1) un numero puo' avere una PARTE INTERA, un ANTIPERIODO ed un PERIODO
    2) la parte PERIODICA DIPENDE dalla base in cui scrivi il numero

    1/3, in base 3 NON HA PERIODO, mentre lo ha in base 2 e 10!

    3) NON PUOI calcolare il periodo di un numero a partire da un numero in floating point! (float o double che sia)
    I numeri PERIODICI sono NUMERI RAZIONALI!!!!!!!

    Qui puoi trovate come calcolare la lunghezza del PERIODO e dell'ANTIPERIODO di un numero SE RAPPRESENTATO IN BASE 10.

    La parte interessante sarebbe generalizzare il tutto per QUALUNQUE base
  • Re: Periodico

    X migliorabile
    grazie per il tentativo ma nell'articolo ho trovato solo come capire se una divisione mi genera un numero periodico o meno.
    e non quando inizia per poter fermare il calcolo in caso di periodicita.
    vorra dire che per quanto riguarda la periodicità semplice userò l'idea che mi venuta.
    per le altre peridicità una volta calcolate tutte le cifre le metterò in una stringa e li trovero la periodicità e la elimino.
    una volta trovata converto la stringa in numero
    parecchio lenta come soluzione ma in mancanza di meglio!
  • Re: Periodico

    In un mio programma ho usato questo algoritmo per individuare il periodo,
    cioe' per sapere da quali e quante cifre e' formato, dove inizia e dove finisce.

    Lo spiego con un esempio:

    345001 : 210 = 1642 con resto = 181

    memorizzo i primi 9 multipli del divisore:

    (1) 210; (2) 420; (3) 630; (4) 840; (5) 1050; (6) 1260; (7) 1470; (8) 1680; (9) 1890;

    181 (resto) * 10 = 1810;

    il massimo multiplo del divisore sottraibile a 1810 e' 1680 (posizione 8,
    che e' la prima cifra della parte decimale);

    metto in lista la coppia 181; 8;

    1810 - 1680 = 130; 130 * 10 = 1300;

    il massimo multiplo sottraibile a 1300 e' 1260 (pos. 6, seconda cifra della parte decimale);

    metto in lista la coppia 130; 6;

    1300 - 1260 = 40; 40 * 10 = 400;

    il mms a 400 e' 210 (pos. 1, terza cifra);

    metto in lista la coppia 40; 1

    400 - 210 = 190; 190 * 10 = 1900;

    il mms a 1900 e' 1890 (pos. 9, quarta cifra decimale);

    metto in lista 190; 9

    1900 - 1890 = 10; 10 * 10 = 100;

    non esiste un multiplo sottraibile a 100; la quinta cifra e' 0;

    metto in lista 10; 0;

    100 - 0 = 100; 100 * 10 = 1000;

    il mms a 1000 e' 840 (pos. 4, sesta cifra);

    metto in lista la coppia 100; 4;

    1000 - 840 = 160; 160 * 10 = 1600;

    il mms a 1600 e' 1470 (pos. 7, settima cifra, ultima del periodo);

    metto in lista 160; 7;

    1600 - 1470 = 130;

    il numero 130 e' gia' presente nella lista, quindi il procedimento
    si ferma; se proseguisse, si ripeterebbero calcoli gia' fatti.

    A questo punto, leggendo in ordine di inserimento le coppie della lista,
    si individua la sequenza di tutte le cifre e si ricava che il periodo
    inizia quando il primo valore della coppia e' 130, associato alla
    seconda cifra (6) e finisce con la cifra (7) dell'ultima coppia.
  • Re: Periodico

    Grazie korr
Devi accedere o registrarti per scrivere nel forum
14 risposte