提问人:Chinnmay B S 提问时间:11/20/2022 最后编辑:wohlstadChinnmay B S 更新时间:12/14/2022 访问量:220
ceil 函数在 c++ 中如何工作?
How ceil function works in c++?
问:
当我执行此代码时,值为 和 。
我知道功能存在一些问题,但无法找出确切的原因。ans1
ans2
50002896
50005000
ceil
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long ans1 = 0, ans2 = 0;
for (long long i = 1; i <= 10000; i++)
{
ans1 = ans1 + ceil((float)i / 1);
ans2 = ans2 + i;
}
cout << ans1 << " " << ans2 << endl;
}
答:
2赞
wohlstad
11/20/2022
#1
问题的根源不在于函数,而在于并非所有整数都可以准确地表示为浮点值。ceil
有关浮点表示的更多信息:维基百科 IEEE 754。以及相关文章:IEEE 754 浮点数无法准确表示的第一个整数是什么?
以下代码是导致问题的同一问题的最小演示:
float f1 = 100000000;
f1++;
std::cout << std::to_string(f1) << std::endl;
[错误]输出(预期:+1):
100000000.000000
一种方法是使用 代替 .
这并不能解决原则问题,但会使可表示整数的范围变大很多:double
float
double f1 = 100000000;
f1++;
std::cout << std::to_string(f1) << std::endl;
输出:
100000001.000000
一些旁注:
- 最好避免 - 请参阅此处:为什么我不应该 #include < bits/stdc++.h>?。
#include <bits/stdc++.h>
- 最好避免 - 请参阅此处 为什么“使用命名空间 std;”被认为是不良做法?
using namespace std
1赞
Sammed
11/20/2022
#2
首先,尝试使用特定的标头,例如 #include ,在这种情况下,.because #include < bits/stdc++.h> 会带来大量垃圾。
所以问题出在下面解释的浮点数而不是 ceil
浮点值不表示精确值。
法典:-
#include <iostream>
#include <iomanip>
using namespace std;
// Driver Code
int main()
{
float num1 = 10000.29;
float num2 = 10000.2;
// Output should be 0.0900000000
cout << std::setprecision(15)
<< (num1 - num2);
return 0;
}
输出:-
0.08984375
评论
#include <bits/stdc++.h>
-- 包括正确的头文件,而不是这个。using namespace std;
std::ceil
ceil
bits...whatever
std::
ceil 和ceil
时结果不同#include < bits/stdc++.h>
?,为什么使用命名空间 std;
被认为是不好的做法?