为什么时钟不能只给我C中的整数

为什么时钟不能只给我C中的整数,c,clock,C,Clock,我正在尝试一个排序函数,非常简单的东西。代码如下所示: 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); 你可以说这很有效。但是,无论需要多长时间,我都会得到一个整数输出。如果打印出来 sort ti

我正在尝试一个排序函数,非常简单的东西。代码如下所示:

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);
你可以说这很有效。但是,无论需要多长时间,我都会得到一个整数输出。如果打印出来

sort time: 1.000000e+00
然后把2百万个元素分类打印出来

sort time: 2.000000e+00
然后对两个元素之间的任何值进行排序,将打印这两个输出中的一个。130万个元素显然也需要100万E+00秒


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

您将双重计算的结果分配给类型为clock\t的total\t,这可能会截断结果,因为clock\t通常是整数类型,但在您的机器上似乎是这样的-打印时,您随后再返回到double并不重要

只需将结果存储在一个double中即可:


命名变量xxxx\u t是一种非常容易引起误解的命名类型惯例。简单吗?不,不是真的。不同的平台为时钟分配不同的语义,您将输出四舍五入到每秒的时钟数,因此您的输出将始终四舍五入到秒total_t=doubleend_t-start_t/clocks_per_SEC;应为total\u t=doubleend\u t-start\u t@guilleamodeo doubleend-start/CLOCKS_PER_second始终提供两次启动之间经过的秒数。另一方面,doubleend-start不能保证有任何有用的值。哎哟!我不是那个意思,我遗漏了一块,当我按粘贴键而不是粘贴时,它必须发送帖子。我的意思是,你需要将时钟每秒转换为双倍……使用长双倍似乎真的太过分了。你真的需要这样精确的计算吗?@rici它主要是根据我链接的帖子推荐的。在你发表评论之前,我还认为长双精度大约是64位,所以不会额外花费太多,但我刚刚发现它通常是80位。我将把它改回double,因为我找不到令人信服的理由来使用long double。@rici,实际上分辨率是每秒时钟数,所以每秒时钟数可能不会超过1000个。。。所以浮动就足够了。
double total = (double)(end - start) / CLOCKS_PER_SEC;
printf("sort time: %le", total);