c++(无符号)(长((双)(8)/(双)log(2.0))==2
c++ (unsigned)(long((double)(8) / (double)log(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的双精度,但当我尝试将它输入为"unsigned int"时,它会给我一个2。
为什么它会给我这个答案?帮助
转换为整数会引入高达1.0的量化(截断)误差。
不管怎样,在计算所需的树深度时,您需要确保四舍五入。
顺便说一句,有比对数比更好的方法来计算对数基数2。例如,gcc的__builtin_clz
将非常有用,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
尝试选择一个可接受的容差(对于您的应用程序来说"足够接近"的容差),并在将其截断为长之前将其添加到结果中。
首先,您错过了一个')'。第二,我们知道,在计算机中用二进制来描述一个数字。对于一些浮点数,我们不能将其转换为二进制,我们只用二进制方法来表示它。这意味着浮点是单精度浮点。所以"长(((双)(8)/(双)log(2.0))"的结果是2.999999。
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 获取隐式转换溢出从无符号到已签名的警告
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- C4018:类内有符号、无符号不匹配
- C++无符号短裤的划分导致 int
- c++(无符号)(长((双)(8)/(双)log(2.0))==2