问题描述
|
如标题所示,我得到的东西很不合理。
我有一个用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。
为什么给我这个答案?救命?
解决方法
强制转换为整数会引入高达1.0的量化(截断)误差。
无论如何,在计算所需的树深度时,您需要确保向上取整。
顺便说一句,计算对数基数2的方法比对数比好得多。例如,gcc \的ѭ2be将非常有帮助,MSVC等效项为
_BitScanReverse
。
, 问题是,从浮点数到整数的转换不会自动进行舍入。小数部分被简单地切掉,数字被截断。即使双倍是2.95834..
,在截断后也将是2
。使用标准库中的ceil
和floor
进行修复。
, 这个:
(unsigned)(long(log((double)(8)) / (double)log(2.0)))
返回3,原因显而易见。
和
(unsigned)(log((double)(8) / (double)log(2.0)));
返回2。
原因我猜舍入错误。由cmath库引起的内部错误导致结果类似2.99 .......,然后将其强制转换为int 2。
对于真正感兴趣的人(无聊?),这是PARC的David Goldberg撰写的一篇很棒的文章:
每位计算机科学家都应了解的浮点运算法则
, 听起来像经典的浮点“取整”问题:
http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems
http://docs.python.org/tutorial/floatingpoint.html
尝试选择一个可接受的公差(对于您的应用程序,该公差“足够接近”)并将其添加到结果中,然后再将其截短。
, 首先,您会错过一个\')\'。
其次,我们知道用计算机中的二进制数来描述一个数字。有些浮点数不能将其转换为二进制数,我们只用二进制方法来表示浮点数。这意味着该浮点数是单精度浮点数。 “ long((double)(8)/(double)log(2.0))\”的结果是2.999999。