2013-05-12 10 views
13
#include <iostream> 
using namespace std; 

int main() 
{ 
    //If a triangle has a perimeter of 9 units, how many iterations(each iteration is 4/3 as much) would it take to obtain a perimeter of 100 units? (or as close to 100 as you can get?) 
    double p = 9; int it = 0; 
    for(p; p < 100; p = p * 4/3){ 
     cout << p << endl; 
     it++; 
    } 
    cout << p << endl; 
    cout << it << endl; 
    system ("PAUSE"); 
    return 0; 
} 

Quindi, per un progetto di matematica che stavo facendo, ho dovuto calcolare quante iterazioni occorrerebbe per un perimetro di 9 per raggiungere 100 se si aumenta il perimetro 4/3x tanto durante ogni iterazione. Quando scrivo il codice come faccio io in precedenza, l'uscita è bene, tuttavia se cambioPerché l'operatore * = non funziona come mi aspetterei?

for(p; p < 100; p = p * 4/3) 

a

for(p; p < 100; p *= 4/3) 

ottengo in uscita che non ha senso. Sto fraintendendo l'operatore * =? Ho bisogno di parentesi da qualche parte?

risposta

28

È l'ordine di operazione. In p = p * 4/3 compilatore sta facendo:

p = (p * 4)/3 

Tuttavia nel p *= 4/3, il compilatore sta facendo:

p = p * (4/3) 

4/3 è 1 nel computer causa di divisione intera, in modo che il secondo esempio è sostanzialmente moltiplicando di 1.

Invece di dividere per 3 (un numero intero), dividere per 3.0 (a doppio) o 3.0f (a virgola mobile). Quindi p * = 4/3.0 e p = p * 4/3.0 sono uguali.

+2

In caso di dubbio, aggiungi una parentesi! –

+6

Oppure prendi fortrany e scrivi '4./3' o' double (4)/3' o una qualsiasi altra varietà di incantesimo che costringerà l'uso dell'aritmetica in virgola mobile. – dmckee

+0

@ Jonathon: le parentesi non saranno d'aiuto qui, vero? 'p * = (4/3)' è ancora sbagliato. – TonyK

Problemi correlati