C语言中函数返回值赋值给变量后输出与直接打印结果不一致
问题原因
- float精度不足
32位单精度浮点数的有效十进制位数仅为6~7位,而当前Unix时间戳的整数部分已经是10位量级(如1633513113),远超出float的精确表示范围。此时float对整数部分的误差最大可达数秒,小数部分的精度会完全丢失,这就是首次输出秒数偏差、毫秒值全为0的核心原因。 - 时间取值逻辑错误
你已经通过clock_gettime获取了同一时间点的秒数(spec.tv_sec)和纳秒数(spec.tv_nsec),却额外调用time(NULL)获取另一个时间点的秒数,两次系统调用的时间点可能存在差异,进一步引入误差。
修复方案
- 将
getTime的返回值类型、接收返回值的变量类型从float改为double:双精度浮点数有15~17位有效十进制位,完全可以满足10位整数+6位小数的微秒级精度需求。 - 直接使用
clock_gettime返回的spec.tv_sec作为秒数来源,无需额外调用time(NULL),保证秒和纳秒属于同一时间点。
修正后代码
#include <stdio.h> #include <time.h> double getTime() { struct timespec spec; clock_gettime(CLOCK_REALTIME, &spec); return (double)spec.tv_sec + (double)spec.tv_nsec / 1000000000.0; } int main() { double test = getTime(); printf("\nAssignment: %f", test); for (int i = 0; i < 30; i ++) { printf("\nPrinting: %f", getTime()); } return 0; }
内容的提问来源于stack exchange,提问作者Xiddoc
相关产品推荐
相关产品推荐

