【问题标题】:Why does clock_t only give me integers in C为什么clock_t只给我C中的整数
【发布时间】:2018-09-04 22:26:10
【问题描述】:

我正在尝试为排序功能计时,非常简单的东西。代码如下:

clock_t start_t, end_t, total_t;
start_t = clock();
sort();
end_t = clock();
total_t = (double)(end_t - start_t) / CLOCKS_PER_SEC;
printf("sort time: %le", (double)total_t);

你可以说这行得通。但是,无论需要多长时间,我都会得到一个整数输出。如果排序 1M 元素打印出来

sort time: 1.000000e+00

排序 2M 个元素会打印出来

sort time: 2.000000e+00

然后对两者之间的任何元素值进行排序将打印这两个输出之一。 1.3M 个元素显然也需要 1.000000e+00 秒。

为什么会发生这种情况,更重要的是我该如何解决?

【问题讨论】:

  • 命名变量 xxxx_t 具有高度误导性,因为它是命名类型的约定。
  • 直截了当?不,不是。不同的平台为clock()分配不同的语义,
  • 您将输出四舍五入为每秒的时钟数,因此您的输出将始终四舍五入为秒 total_t = (double)(end_t - start_t) / CLOCKS_PER_SEC;应该是 total_t = (double)(end_t - start_t);
  • @guilleamodeo (double)(end - start) / CLOCKS_PER_SEC 始终为您提供两次之间经过的秒数 - 另一方面,(double)(end - start) 不保证是任何有用的值。
  • 糟糕!我不是那个意思,我在那里遗漏了一大块(当我按下键粘贴而不是粘贴时它必须发送帖子)。我的意思是您需要将 CLOCKS_PER_SEC 也转换为 double...

标签: c clock


【解决方案1】:

您将double 计算的结果分配给clock_t 类型的total_t,这可能会截断结果,因为clock_t通常是整数类型(不能保证,但似乎所以在你的机器上) - 然后在打印时再转换回double 并不重要。

只需将您的结果存储在double 中,而不是as recommended here

double total = (double)(end - start) / CLOCKS_PER_SEC;
printf("sort time: %le", total);

【讨论】:

  • 使用long double 真的看起来有点矫枉过正。你真的需要这个计算那么准确吗?
  • @rici 这主要是根据我链接的帖子的推荐。在您发表评论之前,我还认为long double 大约为 64 位,因此不会花费太多额外费用,但我刚刚发现它更常见的是 80。我会尽可能将其改回double'找不到使用 long double 的令人信服的理由。
  • @rici,确实分辨率是CLOCKS_PER_SEC,所以可能一秒钟不超过1000个时钟......所以float就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 2019-08-15
  • 2013-01-05
  • 2011-07-13
相关资源
最近更新 更多