Newsgroup: it.comp.lang.c++
Titolo: e il mio pc che impazzisce o e un clamoroso bug

#include <iostream>
using namespace std;
main(){
   int intero;
   double numero;// indifferentemente ho provato ia usando float che 
double
    intero=(int)(56/5); //(56/5)=11.2    quindi 11
    numero=56/5;// teoricamente 11.2
    cout<<(numero-intero)*5;    qualsiasi calcolatrice, o anche la 
vostra mente vi dice che 11.2-11=0.2*5=1
    }
ma invece il mio pc mi da cout<<(numero-intero)*5 = = 0!!!!
ho provato a fare cout<<numero<<" "<<intero<<" ";
                                    11                    11... e il 
0.2 che fine ha fatto

     numero=56/5;// teoricamente 11.2
no.  nel rhs tu dividi due interi, ottieni 11, ed il risultato viene
poi convertito a double.  prova con numero=56.0/5; e ripassa i primi
capitoli del tuo testo.
-- 
  Maurizio Loreti    
ROT13:ybe...@cq.vasa.vg
    |  (@_
Un. of Padova, Dept. of Physics, Padova, Italy  |  //\
 
http://www.pd.infn.it/~loreti/mlo.html
      |  V_/_

#include <iostream>
using namespace std;
main(){
 float a=56;
 float b=5;
 int c=(int)(a/b);cout<<c<<endl;
 float d=a/b;cout<<intero<<endl;
 int in=(int)((d-c)*b);cout<<"("<<d<<"-"<<c<<")"<<"*"<<b<<"="<<in;
 cin>>a;
 }
il programma che sto facendo gestisce i numeri razionali... quindi io 
gli do un num e un den
li divido, tolgo la parte intera e poi ri moltiplico per il 
denominatore...
e sinceramente nn capisco dove ho sbagliato...

 e sinceramente nn capisco dove ho sbagliato...
Dunque, nel primo codice che hai postato ci sono errori grossi come una 
casa!
Ad esempio "numero=56/5;// teoricamente 11.2".
E' assolutamente falso, trattasi di divisione tra interi.
Il secondo codice che hai postato diciamo che sembra più corretto ma ci 
sono gravi ingenuità derivanti dalla tua inesperienza come programmatore.
Prova ad esempio a scrivere il codice seguente invece del tuo e oserva 
cosa succede alla variabile test e alla variabile in, quest'ultima è la 
funzione ceil con argomento test.
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
         float a=56.0,b=5.0;
         int c=a/b;
         float d=a/b;
         float test=(d-c)*b;
         cout << test << endl;
         int in=static_cast<int>(ceil(test));
         cout << in << endl;
         cin >> a;
}
Prova anche
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
         double a=56.0,b=5.0;
         int c=a/b;
         double d=a/b;
         double test=(d-c)*b;
         cout << test << endl;
         int in=static_cast<int>(ceil(test));
         cout << in << endl;
         cin >> a;
}
... e trai le tue considerazioni.
E' curioso che tu abbia pensato al computer impazzito, poi ad un bug 
(forse del compilatore?) ma non ti abbia sfiorato neppure un secondo 
l'idea d'aver scritto male il tuo codice.
Ti consiglio di ristudiare il C++ dalle basi.

 e sinceramente nn capisco dove ho sbagliato...
Nel primo programma avevi sbagliato questo:
numero=56/5;
quando scrivi 56/5 esegui la divisione intera tra 56 e 5, che fa 11. Poi lo
metti in un float e diventa 11.0
Nel secondo programma hai sbagliato a interpretare il concetto di float.
Cioè float è un numero in virgola mobile e non un numero reale. Sono molto
simili, ma purtroppo non uguali. Il numero 11,2 cioè 11+1/5 non può
essere rappresentato esattamente con i numeri in virgola mobile, dato che in
binario è 1011,(0011) con (0011) periodico. Siccome "periodico" non piace al
PC, questo viene approssimato opportunamente e quindi il numero viene
rappresentato come:
1,01100110011001100110011 * 2^3
Premessa: il numero viene normalizzato alla forma 1,xxx... quindi il numero
da codificare diventa 1,0(1100)
Si ottiene cioè un numero molto simile:
8 + 2 + 1 + 1/8 + 1/16 + 1/128 + 1/256 + 1/2048 + 1/4096 + 1/32768 + 1/65536
+ 1/524288 + 1/1048576
In altre parole:
11 + 209715/1048576 = 11,199999809265137
Poi togli 11 e il risultato fa 0,199999809265137 che moltiplicato per 5 fa
0,999999046325683. Questo è praticamente 1, ma non proprio. Se quindi dici
al compilatore di tenere la parte intera è chiaro che il risultato è 0. La
soluzione è convertire all'intero più vicino, che si ottiene semplicemente
sommando al numero il valore 0,5 ed eseguendo successivamente il casting:
#include <iostream>
using namespace std;
int main() {
 float a = 56;
 float b = 5;
 int c = static_cast<int>(a/b);
 cout << c << endl;
 float d = a/b;
 cout << d << endl;
 float e = (d-c)*b;
 cout << e << endl;
 int intero1 = static_cast<int>(e);
 cout << "intero inferiore: (" << d << "-" << c << ")" << "*" << b << "=" << 
intero1 << endl;
 int intero2 = static_cast<int>(e+0.5);
 cout << "intero più vicino: (" << d << "-" << c << ")" << "*" << b << "=" 
<< intero2 << endl;
 return 0;
}
-- 
Costantino Grana

 il programma che sto facendo gestisce i numeri razionali...
In quel programma stai lavorando con numeri floating point. Non con numeri
razionali.
I numeri razionali sono infiniti e hanno la cardinalità di N. I numeri
floating point sono *finiti* e sono tutti rappresentabili in un numero
finito di bit.
Non tutti i numeri razionali (ne tantomeno quelli reali) sono
rappresentabili tramite numeri floating point. I numeri floating point si
limitano ad approssimarli (in modo più o meno buono, quando l'architettura
hardware sottostante ha registri ad 80bit e per i double usa parole di
memoria da 64bit poi ci si trova che i risultati sono formalmente non
deterministici in presenza di multitasking).
Se vuoi davvero usare numeri razionali, puoi cercare nelle librerie
matematiche a precisione arbitraria. Con alcuni accorgimenti ti avvicini
abbastanza alla correttezza (anche se perdi in performance).