2015-07-02 105 views
-3

簡化了二進制小數時,我試圖簡化二進制小數,此代碼來檢查,如果該值爲偶數:無限循環使用C

int is_even(floatlet value){ 
    if(value & 1) return 0; 
    return 1; 
} 

而且這個while循環保持位轉移,直到值奇。

while(is_even(numerator) && is_even(denomExp)){ 
    numerator >>= 1; 
    denomExp <<= 1; 
} 

while循環進行無限循環。我想知道爲什麼? 我們已經完成了測試,並且is_even函數正常工作。謝謝!

+2

什麼是「浮子」? 「分子」和「分母」的類型是什麼? – chqrlie

+0

a)0是偶數,0/2和0 * 2也是如此。b)你沒有打算顯示分子和denomExp的聲明或值......你怎麼可能期望任何人在沒有這些的情況下回答你的問題? –

+0

它是8位浮點數的微型浮點表示形式。分子和分母只是整數。 – skaggs

回答

1

您的環路不正確:您應該將demonExp移至右側。 它無限期運行numerator=0和偶數denomExp

如果numeratordenomExp是整數類型,而且數量僅僅是一小部分numerator/denomExp,您可以修改代碼是這樣的:

while (numerator && is_even(numerator) && is_even(denomExp)) { 
    numerator >>= 1; 
    denomExp >>= 1; 
} 

相反,如果denomExp是2通過分割電源分子,你應該增加它,而不是,也許測試溢出:

while (numerator && is_even(numerator)) { 
    numerator >>= 1; 
    denomExp += 1; 
} 

你必須張貼的類型定義和語義以及有問題的完整代碼。

+0

如果denomExp是一個指數,那麼它們應該是遞減,而不是移位它。 –

+0

@Cameron Skaggs:同意!發佈完整的類型定義和完整的代碼! – chqrlie

+0

「你應該增加它」 - 哦,是的,這就是我的意思。 :-)(我不是Cameron Skaggs。) –