为什么在 c++ 中应用 log 函数时,floor 和 ceil 函数给出不同的值[重复]

问题描述 投票:0回答:2

下面是我编写的求 6 指数的程序,但我给出了错误的输出,或者我可能在某个地方出错了,我在这里无法弄清楚。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
    ll t;
    cin>>t;
    cout<<log(t)/log(6)<<"\n";
    cout<<floor(log(t)/log(6))<<"\n";
    cout<<ceil(log(t)/log(6));
    return 0;
}

输入:-

216

输出:-

3

3

4

由于

216
可以写成
6*6*6
,所以无论有 ceil 还是 Floor,在这三种情况下输出都应该是 3。

回答我自己的问题,这个问题可以通过设置小精度(这里最多2位小数)来解决,下面是相同的程序。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    cout<<log(t)/log(6)<<"\n";
    cout<<floor((floor(log(t)/log(6)*100.0)/100.0))<<"\n";
    cout<<ceil((floor(log(t)/log(6)*100.0)/100.0));
    return 0;
}
c++ logarithm floor ceil
2个回答
3
投票

log
函数 - 与大多数浮点计算一样 - 不精确。结果中常常存在微小的误差。在您的情况下,您没有得到精确的 3,而是稍微大于 3 的某个值。当您将
ceil
floor
应用于这种不精确的结果时,您可能会增加或减少误差量,最多可达整数。在这种情况下,您通过将结果从接近正确的整数提高到恰好跟随的整数来增加误差。


0
投票

如果您想找到一个整数相对于给定基数的指数,那么重复除法并检查余数是一个很好的起点。如果您想获得更多性能,可以研究更快的方法(与平方求幂相关)。

问题是,使用两个

log
调用的比率并将其截断为
int
必然会给您一个不准确的答案,因为
log
的结果很可能无法精确表示为浮点值,并且
log
函数本身可能无法恢复最佳浮点值(C++ 标准和 IEEE754 都不坚持这一点)。

最后,

#define ll long long
,不要这样做。它只会起到混淆视听的作用。并且
#include<bits/stdc++.h>
不是可移植的 C++。

© www.soinside.com 2019 - 2024. All rights reserved.