2012-08-12 14 views
10

Poniżej przedstawiono dwa scenariusze, w których operacje są pozornie identyczne, ale wyniki różnią się o 1. Nie wydaje mi się, żebym musiał wyjaśnić programowanie, jest to bardzo proste.Różne odpowiedzi: dwa proste, identyczne obliczenia całkowite?

Deklaracje zmiennych są pierwsze, scenariusz 1 to 1) i 2 = 2), a uzyskane wyniki są podane jako ostatnie w każdym scenariuszu.

Każda pomoc zostanie bardzo doceniona.

int intWorkingNumber = 176555; 

int intHundreds = 1; 

int intPower = 1; 

1)

int intDeductionValue = (intHundreds * 100 * pow(1000, intPower)); 

intWorkingNumber -= intDeductionValue; 

intWorkingNumber = 76555 

2)

intWorkingNumber -= (intHundreds * 100 * pow(1000, intPower)) 

intWorkingNumber = 76554 
+0

dwukrotny pow (podwójne bazowej dwukrotnie exp) "; - FP nie jest liczbą całkowitą arytmetyczną, więc wyniki jak twoje są po prostu oczekiwane. –

+0

Dziękuję J Steenowi za edycję mojego wcięcia w formatowanie z uwzględnieniem kodu. – Beginner

+0

@ Mark Zwróć uwagę na znak zapytania na końcu - zdanie było domyślnie oznaczało "Czy są to dwa proste, identyczne obliczenia całkowite?". Mimo to, dziękuję za pomoc. – Beginner

Odpowiedz

17

Różnica pomiędzy tymi dwoma próbkami kodu jest, gdy rzucisz na int.

Pierwsza wersja jest podobna do tego kodu, gdzie rzucasz do liczby całkowitej przed odjąć:

intWorkingNumber = 176555 - (int)(1 * 100 * pow(1000, 1)); 

Druga wersja jest podobna do tej, w której rzucisz do liczby całkowitej po odjąć:

intWorkingNumber = (int)(176555 - (1 * 100 * pow(1000, 1))); 

Funkcja pow zwraca liczbę zmiennoprzecinkową. Jeśli wynik 1 * 100 * pow(1000, 1) nie jest dokładnie równy 100000.0000 (i operacje zmiennoprzecinkowe, nie powinieneś zazwyczaj polegać na dokładnych wyników) te dwa nie są równoważne.

Rozważmy prostszy przykład:

x = 10 - (int)0.001; // x = 10 - 0;  => x = 10 
y = (int)(10 - 0.001); // y = (int)9.999; => y = 9 
+3

Należy wspomnieć, że 'pow' zwraca wartość zmiennoprzecinkową, aby miało to sens. – Puppy

+0

@DeadMG: Wspomniany. Dziękuję za komentarz. –

+0

@ Mark Dziękujemy za odpowiedź. – Beginner

Powiązane problemy