2013-05-12 9 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; 
} 

Więc dla projektu matematycznego, który robiłem, musiałem dowiedzieć się, ile powtórzeń zajmie obwód 9, aby osiągnąć 100, jeśli zwiększysz obwód 4/3x tyle podczas każdej iteracji. Kiedy napisać kod tak jak ja powyżej, wyjście jest w porządku, jednak jeśli zmienięDlaczego operator * = nie działa tak, jak bym tego oczekiwał?

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

do

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

mam wyjścia, że ​​nie ma sensu. Czy nie rozumiem operatora * =? Czy gdzieś potrzebuję nawiasów?

Odpowiedz

28

To jest kolejność operacji. W p = p * 4/3 kompilator robi:

p = (p * 4)/3 

Jednak w p *= 4/3, kompilator robi:

p = p * (4/3) 

4/3 to 1 na komputerze z powodu podziału całkowitej, więc drugi przykład jest w zasadzie mnożenia przez 1.

Zamiast dzielenia przez 3 (liczba całkowita), podziel przez 3,0 (podwójne) lub 3.0f (zmienne). Wtedy p * = 4/3.0 i p = p * 4/3.0 są takie same.

+2

W razie wątpliwości dodaj nawias! –

+6

Albo zdobyć wszystkie fortrany i napisać '4./3' lub' double (4)/3' lub dowolną z wielu innych zaklęć, które wymuszą użycie arytmetyki zmiennoprzecinkowej. – dmckee

+0

@ Jonathon: Nawiasy nic tu nie pomogą, prawda? 'p * = (4/3)' jest nadal błędne. – TonyK

Powiązane problemy