2011-06-01 66 views
-3

正如標題所說,我得到的東西非常不合理的。C++(無符號)(長((雙)(8)/(雙)日誌(2.0))== 2?

我有在C++編程什麼進出口試圖做的是找出我的新高度是一個二項式隊列

要做到這一點我使用的算法了在標題:

(unsigned)(long((double)(8)/(double)log(2.0)) 

它實際上是這樣的:

// int count = # of nodes within my vector. 
(unsigned)(long((double)(count)/(double)log(2.0)) 

它打印出一個雙倍的3.00000,但是當我嘗試將它轉換爲「無符號整數」時,它給了我一個2.

爲什麼它給了我這個答案?幫幫我?

+0

你錯過了')'嗎?而且,爲什麼我會得到11? – 2011-06-01 01:11:35

+0

哦,我明白了,它應該是日誌(8)而不是長8嗎? – 2011-06-01 01:13:31

+1

@Ziyao:沒有「日誌」。應該是'log((double)8)'。 – 2011-06-01 01:13:39

回答

5

將整數轉換爲量化(截斷)誤差可達1.0。

無論如何,在計算樹的所需深度時,您需要確保四捨五入。

順便說一句,有很多更好的方法來計算對數比的log 2。例如,海灣合作委員會的__builtin_clz將非常有幫助,MSVC等效爲_BitScanReverse

+0

+1對於「有比計算對數比率log 2更好的方法」 – 2011-06-01 01:22:31

1

問題是,從浮點到整數的轉換不會自動執行舍入。小數部分簡單地被切掉,數字被截斷。即使雙數是2.95834..截斷後它將是2。使用標準庫中的ceilfloor來解決這個問題。

1

此:

(unsigned)(long(log((double)(8))/(double)log(2.0))) 

回報3,理性明顯。

而且

(unsigned)(log((double)(8)/(double)log(2.0))); 

回報2.

原因是什麼?我猜四捨五入錯誤。由cmath庫導致的內部錯誤導致2.99 .......的結果,然後它被轉換爲2的整數。

對於真正感興趣的(無聊?),這裏有一篇很好的文章在這個由PARC的大衛·戈德堡:

What Every Computer Scientist Should Know About Floating-Point Arithmetic

+0

log(8/log(2))對於log2(8)不是有效的表達式。並且不截斷爲2(整數截斷之前的值是1.42448 ...)。 – 2011-06-02 23:29:44

0

第一,你錯過了 ')'。第二,我們知道,用計算機中的二進制來描述一個數字。和一些浮點數,我們不能將它轉換爲二進制,我們只是用二進制表示浮點數,這意味着浮點數是單精度浮點數。「long((double)(8)/(double)log(2.0 ))「結果我是2.999999。