c ++(unsigned)(long((double)(8)/(double)log(2.0))== 2?

时间:2011-06-01 01:05:58

标签: c++ casting logging

正如标题所说我得到的东西非常不合理。

我有一个用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,但是当我尝试将其转换为“unsigned int”时,它会给我一个2。

为什么它给我这个答案?帮助

5 个答案:

答案 0 :(得分:5)

转换为整数会导致量化(截断)误差达到1.0。

无论如何,在计算树的所需深度时,您需要确保向上舍入。

顺便说一句,计算log base 2的方法比对数的比率要好得多。例如,gcc的__builtin_clz非常有用,MSVC等价物为_BitScanReverse

答案 1 :(得分:1)

问题是,从浮点数到整数数的转换不会自动进行舍入。小数部分简单地被切断,数字被截断。即使双精度为2.95834..,截断后它也会为2。使用标准库中的ceilfloor进行修复。

答案 2 :(得分:1)

此:

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

返回3,原因很明显。

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

返回2.

原因?我猜圆周错误。由cmath库引起的内部错误导致结果如2.99 .......然后它被转换为2的int。

对于真正感兴趣的(无聊的?),这是PARC的David Goldberg撰写的一篇优秀文章:

What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 3 :(得分:0)

听起来像经典的浮点“四舍五入”问题:

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

http://docs.python.org/tutorial/floatingpoint.html

尝试选择一个可接受的容差(对于您的应用程序而言“足够接近”)并将其添加到结果中,然后再将其截断为长。

答案 4 :(得分:0)

首先,你错过了')'。 第二,我们知道,用计算机中的二进制来描述一个数字。有些浮点数我们不能把它转换成二进制,我们只用二进制方法表示浮点数。这意味着浮点数是单精度浮点数。所以“长” ((double)(8)/(double)log(2.0))“结果我的是2.999999。