ceil 函数在 c++ 中如何工作?

How ceil function works in c++?

提问人:Chinnmay B S 提问时间:11/20/2022 最后编辑:wohlstadChinnmay B S 更新时间:12/14/2022 访问量:220

问:

当我执行此代码时,值为 和 。
我知道功能存在一些问题,但无法找出确切的原因。
ans1ans25000289650005000ceil

#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;
}
C++ C++11 浮点 CEIL

评论

2赞 PaulMcKenzie 11/20/2022
#include <bits/stdc++.h>-- 包括正确的头文件,而不是这个。
3赞 PaulMcKenzie 11/20/2022
由于没有使用正确的标准头文件,再加上在不知道非标准头文件正在拉取什么的情况下,我们不知道它是 C 运行时库还是来自 C 运行时库。这就是为什么使用是一个坏主意,更不用说它不是标准的了。using namespace std;std::ceilceilbits...whatever
3赞 PaulMcKenzie 11/20/2022
使用 std::ceil 和 ceil 时结果不同
1赞 PaulMcKenzie 11/20/2022
@RohanBari 如果不包含正确的头文件,则无法保证编译。
2赞 phuclv 11/20/2022
为什么我不应该 #include < bits/stdc++.h>为什么使用命名空间 std; 被认为是不好的做法?

答:

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

一种方法是使用 代替 .
并不能解决原则问题,但会使可表示整数的范围变大很多:
doublefloat

double f1 = 100000000;
f1++;
std::cout << std::to_string(f1) << std::endl;

输出:

100000001.000000

一些旁注:

  1. 最好避免 - 请参阅此处:为什么我不应该 #include < bits/stdc++.h>?#include <bits/stdc++.h>
  2. 最好避免 - 请参阅此处 为什么“使用命名空间 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