gpt4 book ai didi

c - 使用 printf 打印 clock_t 的正确方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 16:23:01 28 4
gpt4 key购买 nike

我目前正在使用显式转换为 unsigned long long 并使用 %llu 打印它,但是因为 size_t%z 说明符,为什么 clock_t 没有?

它甚至没有宏。也许我可以假设在 x64 系统(OS 和 CPU)上 size_t 的长度是 8 个字节(即使在这种情况下,他们已经提供了 %z),但是什么关于clock_t

最佳答案

似乎没有完美的方法。问题的根源在于 clock_t 可以是整数或 float 。

clock_t 可以是浮点型

作为Bastien Léonard mentions对于 POSIX(去投票给他),C99 N1256 draft 7.23.1/3 还说:

[clock_t is] arithmetic types capable of representing times

和 6.2.5/18:

Integer and floating types are collectively called arithmetic types.

并且标准将算术类型定义为整数或浮点类型。

如果要除以 CLOCKS_PER_SEC,请使用 long double

clock() 的返回值是实现定义的,从中获得标准含义的唯一方法是除以 CLOCKS_PER_SEC 以找到秒数:

clock_t t0 = clock();
/* Work. */
clock_t t1 = clock();
printf("%Lf", (long double)(t1 - t0));

这已经足够好了,尽管还不够完美,原因有以下两个:

  • 对于浮点类型,似乎没有类似于 intmax_t 的类比:How to get the largest precision floating point data type of implemenation and its printf specifier?因此,如果明天出现更大的浮点类型,它可能会被使用并破坏您的实现。

  • 如果 clock_t 是一个整数,则转换为 float 已明确定义为尽可能使用最接近的 float。您可能会失去精度,但与绝对值相比并没有多大关系,并且只会在很长时间内发生,例如long int在x86中是80位 float ,64位有效,秒数百万年。

Go upvote lemonad谁说了类似的话。

如果您认为它是一个整数,请使用 %ju 和 uintmax_t

尽管 unsigned long long 是目前可能的最大标准整数类型:

因此最好将类型转换为可能的最大无符号整数类型:

#include <stdint.h>

printf("%ju", (uintmax_t)(clock_t)1);

uintmax_t 保证具有机器上可能的最大整数大小。

uintmax_t 及其 printf 说明符 %ju 是在 c99 中引入的,例如 gcc 实现了它们。

作为奖励,这一劳永逸地解决了如何可靠地 printf 整数类型的问题(不幸的是 clock_t 不一定是这种情况)。

如果是 double 会出什么问题:

  • 如果太大而不适合整数,则为未定义行为
  • 比 1 小得多,将四舍五入为 0,您将看不到任何东西

由于这些后果比整数到 float 的转换要严重得多,因此使用 float 可能是一个更好的主意。

在 glibc 2.21 上它是一个整数

手册说使用 double 是一个更好的主意:

On GNU/Linux and GNU/Hurd systems, clock_t is equivalent to long int and CLOCKS_PER_SEC is an integer value. But in other systems, both clock_t and the macro CLOCKS_PER_SEC can be either integer or floating-point types. Casting CPU time values to double, as in the example above, makes sure that operations such as arithmetic and printing work properly and consistently no matter what the underlying representation is.

在 glibc 2.21 中:

另见

关于c - 使用 printf 打印 clock_t 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1083142/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com