测量经过的时间(以 C 为单位) - 纳秒 - 浮点铸造

问题描述 投票:0回答:2

我想测量两个事件之间的持续时间,例如捕获不同时间点的CPU快照。 与

float
相乘后是否需要在这里对
1000000000L
进行强制转换?正确吗?

float get_elapsed(domain_info *dom) {
    
    float temp;

    temp = (float)((dom->t2.tv_sec - dom->t1.tv_sec) * 1000000000L + (dom->t2.tv_nsec - dom->t1.tv_nsec);

    return temp;
}
c floating-point
2个回答
3
投票

我们不知道

typedef struct {} domain_info
是什么,并且表达式有不匹配的括号,因此无法编译。假设您的意思是:

#include <time.h>

typedef struct {
    struct timespec t1;
    struct timespec t2;
} domain_info;

float get_elapsed(domain_info *dom){
    return (float)((dom->t2.tv_sec - dom->t1.tv_sec) * 1000000000L +(dom->t2.tv_nsec - dom->t1.tv_nsec));
}

int main(void) {
    // ...
}

编译器会将表达式转换为

float
,因此您不需要显式转换或
temp
变量。

在我的系统上,tv_sec 是 64 位

long
,但如果是 32 位,则在
(dom->t2.tv_sec - dom->t1.tv_sec)
溢出之前只有几秒的增量。如果它是有符号类型,就像在我的系统上一样,这是未定义的行为。

在按因子

double
缩放
float
时,优先选择 tv_sec 而非
1000000000L
来提高
精度
,并且还对
tv_nsec
的增量感兴趣。


0
投票

long
够宽吗?

(dom->t2.tv_sec - dom->t1.tv_sec) * 1000000000L

long
 为 32 位时,
time_t
会出现问题。

相反,要确保更广泛的数学。

<stdint.h>
提供至少形成所需位宽度的宏。

(dom->t2.tv_sec - dom->t1.tv_sec) * INT64_C(1000000000)

现在乘法将至少是 64 位。


有必要做演员吗

float
(?)

通常使用的默认 FP 类型是

double
。如果需要 FP 返回类型,强制转换可以消除转换警告,这是一个很好的做法。

  • 最好将
    const
    用于引用的数据,因为该函数不会更改它,因此允许调用代码将指针传递给
    const
    数据。
double get_elapsed(const domain_info *dom){
  return (double) (//
      (dom->t2.tv_sec - dom->t1.tv_sec) * INT64_C(1000000000) + //
      (dom->t2.tv_nsec - dom->t1.tv_nsec));
}
© www.soinside.com 2019 - 2024. All rights reserved.