首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >log2计算在cpp中给出错误的结果

log2计算在cpp中给出错误的结果
EN

Stack Overflow用户
提问于 2017-05-14 00:46:54
回答 2查看 722关注 0票数 2

在计算大于49的数字的log2值时,visual studio 2015和gcc4.8都给出了错误的结果。

代码语言:javascript
复制
double log2_49_ones = log2(0x1FFFFFFFFFFFF); // result is 49 - should be 48
double log2_48_ones = log2(0xFFFFFFFFFFFF); // result is 47 - correct result

你知道这是不是个bug?

EN

回答 2

Stack Overflow用户

发布于 2017-05-14 00:59:46

log2()接受浮点数/双精度数作为参数,因此在隐式强制转换过程中可能会丢失精度。

你可以使用这个技巧:

代码语言:javascript
复制
unsigned int number = 59029; // example
int targetlevel = 0;
while (number >>= 1) ++targetlevel;

由这个answer提供。

票数 2
EN

Stack Overflow用户

发布于 2017-05-14 00:59:51

在多种语言中使用相同的浮点格式,因此这可能是一个一般性问题。例如,在Chrome 58 for Windows的Javascript中,我看到了与您相同的结果。

代码语言:javascript
复制
Math.log2(0x1FFFFFFFFFFFF) 
49 // this really is 49, i.e. if you subtract 49, it is 0
Math.log2(0xFFFFFFFFFFFF) 
47.99999999999999 // This would be 47 if put into an int

让我们不要称这是一个bug:它工作在浮点格式和/或软件库的能力极限附近。

如果您希望正确答案达到大约2^53,那么对于较大的数字,您可以进行一些整数除法,以便log2可以在其合适的范围内运行。在Javascript中(对不起!请不要杀我),例如

代码语言:javascript
复制
function betterLog2 (x) {
    if (x<2**32){
        return Math.log2(x)
    } else { 
        return 32 + Math.log2(parseInt(x/(2**32)))
    }
}

它似乎给出了2^53-1以下的整数的正确答案。

同样的原则应该适用于任何语言和实现。我怀疑任何语言实现都会有一个库来将log2的值四舍五入到2**32以下。

希望它能帮助8-)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43955597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档