Problema static_cast e altre vie

di il
13 risposte

Problema static_cast e altre vie

Salve a tutti

Il mio bizzarro problema è questo:
Sto provando per esercizio a scrivere un programma che, fornito un qualsiasi numero reale, restituisca in due output diversi la parte intera, e le prime tre cifre della parte decimale (vista come intero)

Ad esempio
input k=12.2398
output C=12
output M=239

Questo è il codice che avrei pensato:
#include<iostream> 
using namespace std;

int main(){

cout << "Di un numero decimale k, estraggo la parte intera, C, e un intero rappresentante le prime tre cifre della parte decimale, M.\nAd esempio:\nk=12345.6789 ---> C=12345  M=678" << endl;

double k;
int C, M;

cout << "Inserire il numero decimale k:" << endl;
cin >> k;

 C=static_cast<int>(k); 
 M=static_cast<int>((k-C)*1000);

cout << "C=" << C << endl;
cout << "M=" << M << endl;

return 0;
}
Per la parte intera nessun problema con static_cast<int>

Per il secondo risultato ho pensato di sottrarre a tutto k la sua parte intera e moltiplicare 1000, poi riapplicare static_cast<int> a quest'ultimo numero.


Questo funziona per alcuni numeri, e per altri no!

Ad esempio, se io metto dentro k=12.24576 mi sputa correttamente M=245
Se invece metto dentro k=12.2 mi sputa 199, anziché 200.

Come mai?

Preciso che ho tentato con lo stesso codice rimuovendo gli static_cast, eseguendo i calcoli a parte, aggiungendo variabili per diluire... Ad esempio se dichiaro una variabile double t, dopo aver definito C, ed inserisco il calcolo e l'output
t=(k-C)*1000;
cout << "t=" << t << endl;
tutto funziona come dovrebbe, difatti se il risultato è un intero questo è giusto, altrimenti ovviamente mi dà anche delle cifre decimali, ma poi una volta che lo inserisco in questo modo
M=static_cast<int>(t);
questo inizia a dare problemi, in quanto tronca correttamente il numero se ha delle cifre decimali, ma se non ne ha spesso torna a dare il problema di prima (tornando agli esempi di qualche riga fa, se inserisco k=12.24576 mi dà t=245.76 e M=245, se inserisco k=12.2 mi dà t=200 e k=199).
Stessa cosa succede se provo a mettere al posto dell'ultima riga di codice citata
M=t;
Avrei davvero bisogno di aiuto, perché non riesco proprio a capire!

Grazie in anticipo.


Ps. Per aggirare il problema ho pensato di usare una struttura if... else, che usi static_cast quando t ha cifre decimali e che invece butti direttamente fuori t se è un intero. Può avere senso? E che espressione inserisco per esprimere questa cosa?

13 Risposte

  • Re: Problema static_cast e altre vie

    Ciao Gywhard

    Non è detto che un numero che puoi rappresentare in decimale con un numero finito di cifre lo sia pure quando lo rappresenti in binario, ad esempio:

    18,6 decimale = 10010,[1001] base 2, la parte tra parentesi è periodica.

    Nel tuo caso non hai a che fare con la rappresentazione in binario ma con quella in floating point, ma il principio è lo stesso. Il numero 12.2 diventa 12.199999...

    Dopo aver fatto i calcoli in virgola mobile, prima di convertire in intero dovresti arrotondare all' intero più vicino.
    
    #define _USE_MATH_DEFINES
    #include<math.h> 
    
    #include<iostream> 
    using namespace std;
    
    double Round(double d) 
    {
        return (d > 0.0) ? floor(d + 0.5) : ceil(d - 0.5);
    }
    
    int main()
    {
    	cout << "Di un numero decimale k, estraggo la parte intera, C, e un intero rappresentante le prime tre cifre della parte decimale, M.\nAd esempio:\nk=12345.6789 ---> C=12345  M=678" << endl;
    
    	double k;
    	int C, M;
    
    	cout << "Inserire il numero decimale k:" << endl;
    	cin >> k;
    
    	C=static_cast<int>(k); 
    	M=static_cast<int>(Round((k-C)*1000));
    
    	cout << "C=" << C << endl;
    	cout << "M=" << M << endl;
    
    	return 0;
    }
    
    Se usi solo numeri positivi non ti serve la funzione Round ma ti basta scrivere
    
    floor(d + 0.5)
    
  • Re: Problema static_cast e altre vie

    Ciao barba59,

    Pensavo che usando il mio codice iniziale non avrebbe dato problemi soprattutto nei casi in cui il calcolo di t buttava già fuori un numero "tondo"... E invece faceva pasticci proprio sui numeri che in t uscivano già "tondi"!

    Ti ringrazio per l'utile spiegazione.
  • Re: Problema static_cast e altre vie

    Non capisco quale sia la definizione di numero "tondo" per il sistema di numerazione binario ...
  • Re: Problema static_cast e altre vie

    Ciao Oregon

    oregon ha scritto:


    Non capisco quale sia la definizione di numero "tondo" per il sistema di numerazione binario ...
    Per numero tondo si intende un numero che termina con uno o più zeri. Quindi in base 10 si intende un multiplo di 10 e in binario un numero pari.

    Questa è la definizione generale, poi Gywhard ha usato il termine 'numero tondo' per indicare un numero che in decimale si rappresenta con un numero finito di cifre.
  • Re: Problema static_cast e altre vie

    barba59 ha scritto:


    Ciao Oregon

    oregon ha scritto:


    Non capisco quale sia la definizione di numero "tondo" per il sistema di numerazione binario ...
    Per numero tondo si intende un numero che termina con uno o più zeri. Quindi in base 10 si intende un multiplo di 10 e in binario un numero pari.

    Questa è la definizione generale, poi Gywhard ha usato il termine 'numero tondo' per indicare un numero che in decimale si rappresenta con un numero finito di cifre.
    Intendevo proprio che terminava con 0... Perché dava questo problema proprio con i numeri che uscivano tipo 200, 120... Che terminano con 0 e senza decimali!
  • Re: Problema static_cast e altre vie

    Mi sembra una definizione un po' "opinabile" dato che potrei inventare un sistema di numerazione posizionale, ad esempio "ternario" con i simboli 1 X 2 , senza possibilità di utilizzare uno '0' ...
  • Re: Problema static_cast e altre vie

    oregon ha scritto:


    Mi sembra una definizione un po' "opinabile" dato che potrei inventare un sistema di numerazione posizionale, ad esempio "ternario" con i simboli 1 X 2 , senza possibilità di utilizzare uno '0' ...
    Su oregon fa il bravo, poi me li confondi questi ragazzi !
    I sistemi di numerazione posizionali necessitano della cifra zero.
  • Re: Problema static_cast e altre vie

    Più che altro è necessario "il simbolo che individua una posizione vuota" ma non è detto che debba essere lo 0 ...
  • Re: Problema static_cast e altre vie

    Ciao oregon,
    Bello questo giochino!

    "Cosa c'è in un nome? Ciò che chiamiamo rosa anche con un altro nome conserva sempre il suo profumo."
    William Shakespeare.

    Questo vale anche per lo zero.

    Per la definizione di numero tondo vedi:


    Per i sistemi di numerazione posizionali vedi:
    http://it.wikipedia.org/wiki/Sistema_di_numerazione_posizionale
  • Re: Problema static_cast e altre vie

    barba59 ha scritto:


    Ciao oregon
    Beh .... suggerirmi addirittura di leggere wikipedia lo potrei prendere come un affronto ... se non fosse che questo è un "giochino" OT ... meglio chiudere quindi ...

    Buon lavoro e grazie per i suggerimenti per le ottime letture ...
  • Re: Problema static_cast e altre vie

    oregon ha scritto:


    suggerirmi addirittura di leggere wikipedia lo potrei prendere come un affronto ... se non fosse che questo è un "giochino" OT ... meglio chiudere quindi ...
    Veramente non siamo OT e non sei tu che deve decidere quando chiudere una discussione.

    Ti sei intromesso in una interessante discussione tra me e Gywhard, all' inizio pensavo in maniera simpatica e scherzosa vista l' abbondanza di faccine, poi ti sei mostrato risentito. Boh. Se non vuoi leggere Wikipedia non farlo, consiglio agli altri di farlo, non si finisce mai di imparare.

    Riassumendo (e rimanendo in tema):

    - un numero periodico in decimale non è detto che lo sia in binario (e viceversa)
    - per ovviare ai problemi segnalati da Gywhard bisogna ricorrere a degli arrotondamenti.
    - Un numero tondo è un un numero che finisce con uno o più zeri.
    - La definizione di numero tondo è la stessa anche se cambi base.
    - Un sistema di numerazione posizionale necessita dello zero.
    - Se vuoi essere pignolo, un sistema di numerazione posizionale necessita anche dell' 1.

    - La frase: "potrei inventare un sistema di numerazione posizionale, ad esempio "ternario" con i simboli 1 X 2 , senza possibilità di utilizzare uno '0'" è evidentemente una battuta, specie se detta da uno che non deve leggere Wikipedia.

    L' ultima era una battuta per mantenere la discussione più leggera, in fondo siamo tra amici.
  • Re: Problema static_cast e altre vie

    Con "chiudere" non intendevo che lo facesse qualcuno (tanto meno io) ma intendevo non discutere più qui ... e penso sia OT parlare di sistemi di numerazione rispetto al titolo del thread .... cosa che non volevo continuare a fare per primo io (che mi sono "intromesso" come hai detto con un certo fastidio).

    Figurati quindi se sono risentito, ma se dopo un po' di faccine mi suggerisci wikipedia (in risposta ad una mia battuta, non in generale) allora o non hai visto la faccina o non ne tieni conto ...

    Amici come prima.
  • Re: Problema static_cast e altre vie

    Ciao oregon,
    Nessun problema, magari non ci siamo capiti o abbiamo modi di scherzare differenti.
Devi accedere o registrarti per scrivere nel forum
13 risposte