在计算大于49的数字的log2值时,visual studio 2015和gcc4.8都给出了错误的结果。
double log2_49_ones = log2(0x1FFFFFFFFFFFF); // result is 49 - should be 48
double log2_48_ones = log2(0xFFFFFFFFFFFF); // result is 47 - correct result你知道这是不是个bug?
发布于 2017-05-14 00:59:46
log2()接受浮点数/双精度数作为参数,因此在隐式强制转换过程中可能会丢失精度。
你可以使用这个技巧:
unsigned int number = 59029; // example
int targetlevel = 0;
while (number >>= 1) ++targetlevel;由这个answer提供。
发布于 2017-05-14 00:59:51
在多种语言中使用相同的浮点格式,因此这可能是一个一般性问题。例如,在Chrome 58 for Windows的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中(对不起!请不要杀我),例如
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-)
https://stackoverflow.com/questions/43955597
复制相似问题