正如标题所说我得到的东西非常不合理。
我有一个用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。
为什么它给我这个答案?帮助
答案 0 :(得分:5)
转换为整数会导致量化(截断)误差达到1.0。
无论如何,在计算树的所需深度时,您需要确保向上舍入。
顺便说一句,计算log base 2的方法比对数的比率要好得多。例如,gcc的__builtin_clz
非常有用,MSVC等价物为_BitScanReverse
。
答案 1 :(得分:1)
问题是,从浮点数到整数数的转换不会自动进行舍入。小数部分简单地被切断,数字被截断。即使双精度为2.95834..
,截断后它也会为2
。使用标准库中的ceil
和floor
进行修复。
答案 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。