C++ 谁能解释一下C+中log2的不精确性+/python

C++ 谁能解释一下C+中log2的不精确性+/python,c++,python-2.7,math,C++,Python 2.7,Math,我知道log2(x)的精度在x足够大并且对于大多数语言都是2^n-1形式时失败,除了R和Matlab可能是。有什么具体原因吗 编辑1:x是一个10^15左右的整数,如果x足够大(我认为对于IEEE double大约是4.5E15),则2^n-1不可表示。如果x足够大(对于IEEE double,我认为大约是4.5E15),则2^n-1不可表示。这是一个通用浮点(IEEE 754)不精确性问题,与日志函数关系不大。在某一点上,浮点数中不能再表示1的差值,因为在尾数中设置下一位可能会增加一个可能比1

我知道log2(x)的精度在x足够大并且对于大多数语言都是2^n-1形式时失败,除了R和Matlab可能是。有什么具体原因吗


编辑1:x是一个10^15左右的整数,如果
x

足够大(我认为对于IEEE double大约是4.5E15),则2^n-1不可表示。

如果
x
足够大(对于IEEE double,我认为大约是4.5E15),则2^n-1不可表示。

这是一个通用浮点(IEEE 754)不精确性问题,与日志函数关系不大。在某一点上,浮点数中不能再表示1的差值,因为在尾数中设置下一位可能会增加一个可能比1大得多的数值。考虑这个例子:

int main() {
    double d = 4.5E15;
    while(d != d + 1){++d;} //should always be true: d != d + 1
    cout << d;
    return 0;
}
intmain(){
双d=4.5E15;
而(d!=d+1){++d;}//应该始终为true:d!=d+1

CUT

这是一个通用浮点(IEEE 754)不精确性问题,与日志函数几乎没有关系。在某个点上,不能再在浮点数中表示一个差,因为在尾数中设置下一个比特会增加一个数量大于一个数字的数量。

int main() {
    double d = 4.5E15;
    while(d != d + 1){++d;} //should always be true: d != d + 1
    cout << d;
    return 0;
}
intmain(){
双d=4.5E15;
而(d!=d+1){++d;}//应该始终为true:d!=d+1

你指的是什么?谢谢..有了更好的理解..你指的是什么?谢谢..有了更好的理解..
while(d!=+d){}
-那里没有序列点-这是未定义的行为…也许
while(d!=d+1)++d;
会说明你的观点吗?
while(d!=+d){
-这里没有序列点-这是未定义的行为…也许
而(d!=d+1)++d;
会说明你的观点吗?