c++(无符号)(长((双)(8)/(双)log(2.0))==2

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

本文关键字:无符号 log c++      更新时间:2023-10-16

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

我有一个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的__builtin_clz将非常有用,MSVC的等价物是_BitScanReverse

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

这:

(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

尝试选择一个可接受的容差(对于您的应用程序来说"足够接近"的容差),并在将其截断为长之前将其添加到结果中。

首先,您错过了一个')'。第二,我们知道,在计算机中用二进制来描述一个数字。对于一些浮点数,我们不能将其转换为二进制,我们只用二进制方法来表示它。这意味着浮点是单精度浮点。所以"长(((双)(8)/(双)log(2.0))"的结果是2.999999。