C 将两个64位数字相除,并将结果存储在浮点数中,而不会丢失精度

C 将两个64位数字相除,并将结果存储在浮点数中,而不会丢失精度,c,precision,C,Precision,假设您有一个非常大的64位值,以微秒为单位测量时间。我想把它转换成一个浮点,以秒为单位,这意味着时间值除以1000000。在不丢失数据的情况下,您可以按什么顺序执行除法和转换 如果我先执行除法,它仍然是一个整数,并且我丢失了测量的亚秒部分。如果首先将该值转换为float,则测量值将从64位截断为24位,并且结果不正确 如果同时执行两个操作,编译器是否足够聪明,知道该怎么做?或者这需要手动将其分解成碎片吗 我知道我可能仍然会因为到目前为止的除法而失去最终浮点的精度,这很好。我希望避免由于执行转换的

假设您有一个非常大的64位值,以微秒为单位测量时间。我想把它转换成一个浮点,以秒为单位,这意味着时间值除以1000000。在不丢失数据的情况下,您可以按什么顺序执行除法和转换

如果我先执行除法,它仍然是一个整数,并且我丢失了测量的亚秒部分。如果首先将该值转换为float,则测量值将从64位截断为24位,并且结果不正确

如果同时执行两个操作,编译器是否足够聪明,知道该怎么做?或者这需要手动将其分解成碎片吗


我知道我可能仍然会因为到目前为止的除法而失去最终浮点的精度,这很好。我希望避免由于执行转换的方式而造成的任何额外损失。

既然您提到了24位,我假设您使用的是浮点数(
float
)。使用,您将获得53位尾数。这对于几微秒应该足够了,否则在x86-64上使用gcc将得到63位尾数。

“结果不正确”-怎么会这样?为什么不使用双精度尾数?浮点只有23位精度,双精度有52位精度。将一个常数值(
1000000
)除法视为一个除法可能会令人困惑。将该操作视为与值的倒数相乘(
0.000001
)。我假设/猜测您正在使用64位数字进行基准测试。并且,数字来自将
gettimeofday/timeval
clock\u gettime/timespec
转换为
long
。当我这样做时,我通常对[代码>结束时间-开始时间的差异]感兴趣。我将数字保留在
long long
中,并且在打印时仅将差值转换为
double
(例如
printf(“已用时间:%.9f\n”,usec_to_sec(dif));
如果将微秒数转换为
double
(使用IEEE-754二进制64)除以1000000,会有两个小的舍入误差,总误差约为1/2^−52.这比每世纪1微秒的精度要好。时钟测量这些微秒的精度从一开始就精确吗?80位是整个长双精度的大小,而不是尾数的大小。扩展精度给出63位分数加整数位。谢谢你们,答案是固定的。是的,使用双精度是正确的ect答案。2^53微秒大约是280年。这对于任何实际用途来说都足够了。