在不损失精度的情况下更改浮点指数
Change float exponent without losing precision
我想将 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)
嗯,看起来也是格式问题。
要查看小数点后 9 位,请使用 printf("%.9f\n", elapsed_sec);
。
考虑 printf("%.*g\n", DBL_DIG, elapsed_sec);
更通用的方法。
使用 double
而不是 float
。由于 float
的精度有限导致意外输出 - 在 6 位有效数字后 float
开始出现错误。
对于|值|最多 224,float
通常具有足够的精度来准确编码整数。
对于|值|最多 253,double
通常具有足够的精度来准确编码整数。
printf("%f\n", (double) elapsed_nano);
double elapsed_sec = elapsed_nano / 1000000000.0;
printf("%f\n", elapsed_sec);
看起来 OP 正在为 C 代码使用 C++ 编译器。
我想将 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)
嗯,看起来也是格式问题。
要查看小数点后 9 位,请使用 printf("%.9f\n", elapsed_sec);
。
考虑 printf("%.*g\n", DBL_DIG, elapsed_sec);
更通用的方法。
使用 double
而不是 float
。由于 float
的精度有限导致意外输出 - 在 6 位有效数字后 float
开始出现错误。
对于|值|最多 224,float
通常具有足够的精度来准确编码整数。
对于|值|最多 253,double
通常具有足够的精度来准确编码整数。
printf("%f\n", (double) elapsed_nano);
double elapsed_sec = elapsed_nano / 1000000000.0;
printf("%f\n", elapsed_sec);
看起来 OP 正在为 C 代码使用 C++ 编译器。