2012-08-12 18 views
10

Aşağıda, işlemlerin görünüşte aynı olduğu ancak 1'den farklı sonuçlar ürettiği iki senaryo vardır: Programlamayı açıklamamız gerektiğini düşünmüyorum, bu çok basit.Farklı cevaplar: iki basit özdeş hesaplamalar?

Değişken bildirimleri önce, senaryo 1, 1) ve 2 = 2'dir ve elde edilen sonuçlar her senaryoda en son listelenir.

Herhangi bir yardım büyük memnuniyetle karşılanacaktır. Eğer int döküm zaman

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

'çift pow (çift bazlı, çift exp); - FP tamsayı aritmetiği değil, bu yüzden sizinki gibi sonuçlar bekleniyor. –

+0

J Steen sayesinde sorularımın girintisini düzenlediğim için kodlama formatı belirlendi. – Beginner

+0

@Mark Sonunda soru işaretini not edin - "Bu iki basit tam sayı hesaplaması mı?" Yine de yardım için teşekkürler. – Beginner

cevap

17

iki kod numuneleri arasındaki farktır.

ilk sürümü önce tamsayı dökme Bu kodun, benzer sen çıkarma:

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

ikinci versiyonu size çıkarma sonra tamsayı dökme nerede bu, benzer:

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

kayan nokta sayısı döner pow işlev. 1 * 100 * pow(1000, 1) sonucu tam olarak100000.0000'a eşitse (ve kayan nokta işlemleri ile, normalde kesin sonuçlara güvenmemelisiniz) bu ikisi eşdeğer değildir.

Bu basit örneği ele alalım:

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

“pow” nin bunun anlamlı olması için bir float döndürdüğünden bahsetmeliyiz. – Puppy

+0

@DeadMG: Söz konusu. Yorum için teşekkürler. –

+0

@Mark Cevabı için teşekkürler. – Beginner