【发布时间】:2020-07-22 10:09:47
【问题描述】:
我想将 int64_t 值 [纳秒] 转换为浮点(或双精度)[秒] 值。
所以我尝试了以下方法:
int64_t elapsed_nano = 7079206912L;
printf("%f\n", float(elapsed_nano));
float elapsed_sec = float(elapsed_nano) / float(1000000000);
printf("%f\n", elapsed_sec);
这似乎切断了最后一点......可能是由于一些内部四舍五入。这里的输出:
7079206912.000000
7.079207
我尝试与 float(0.000000001) 相乘,但没有帮助。
我想最好的办法是改变浮点数的指数,尽管我没有找到任何关于如何做到这一点的文档。
我正在使用 gcc 4.8.5(由于不同的原因无法更新到更新的 gcc)
【问题讨论】:
-
正如你所说,这似乎是最后一点的删减。您可以尝试使用 float_32 而不是使用浮点数,这可能会让您达到better precision
-
在哪个标头中定义了 float_32 ?找不到有关该类型的任何信息。
-
@AbhayAravinda:乘以 1e-9 会增加舍入误差的数量:1e9 可以精确表示,但 1e-9 不能。所以
x / 1e9f只在除法中产生舍入错误,但x * 1e-9f在将1e-9f转换为float时产生一个舍入错误,而在乘法中出现另一个舍入错误。 -
使用
float和想要准确性是不兼容的选择。使用double会提高您获得有意义结果的机会。 -
您不能“仅 [...] 更改指数”。至少不是以 10 为底。您的硬件使用二进制,并且指数也是基于二进制的。这样,您可以“更改指数”以使用 2 的任何幂进行乘/除,但您不能“更改指数”以使用 10 的幂来实现相同的结果。后面有一个 5 因子必须导致舍入误差。
标签: c floating-point exponent