c ++unsignedlongdouble8/doublelog2.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 \的ѭ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。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...