【问题标题】:How ceil function works in c++?ceil 函数如何在 C++ 中工作?
【发布时间】:2022-11-20 15:30:00
【问题描述】:

当我执行此代码时,ans1ans2 的值是5000289650005000
我知道 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;
}

【问题讨论】:

  • #include &lt;bits/stdc++.h&gt;——包括正确的头文件,而不是这个。
  • 可能是因为(float),而不是因为ceilfloat 不完全准确。
  • 通过不使用适当的标准头文件,加上 using namespace std; 的使用,不知道那个非标准头文件在拉什么,我们不知道它是 C 运行时库中的 std::ceil 还是 ceil。这就是为什么使用 bits...whatever 不是一个好主意,更不用说它不是标准的了。
  • @RohanBari 如果您不包含正确的头文件,则无法保证编译。

标签: c++ c++11 floating-point ceil


【解决方案1】:

问题的根源不是ceil 函数,而是并非所有整数都可以准确地表示为浮点值。有关浮点表示的更多信息:Wikipedia 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 &lt;bits/stdc++.h&gt;,请参阅:Why should I not #include <bits/stdc++.h>?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    相关资源
    最近更新 更多