我知道当x足够大时log2(x)精度失败,对于大多数语言,其形式为2 ^ n-1,除了R和Matlab可能。任何具体原因?
编辑1:x是一个大约10 ^ 15及以上的整数
答案 0 :(得分:2)
当x
足够大时(对于IEEE双倍大约4.5E15,我认为),2 ^ n-1是不可表示的。
答案 1 :(得分:2)
这是一般浮点(IEEE 754)不精确问题,与日志功能关系不大。在某些时候,不能再用浮点数表示一个差值,因为设置尾数中的下一位会增加一个可能远大于数字的数量。考虑这个例子:
int main() {
double d = 4.5E15;
while(d != d + 1){++d;} //should always be true: d != d + 1
cout << d;
return 0;
}
你可能会期望它无限运行,但是这会立即返回并在我的平台上打印4.5E15,很可能也会在你的平台上打印。