0

我想在不丢失 C 精度的情况下进行以下计算。

uint64_t ts_1 = 0x5212cb03ca115ac0; 
uint64_t ts_2 = 0x5212cb03ca115cc0; 
uint64_t ts_delta = (ts_2 - ts_1)

double scale_factor = ts_delta/(2^32)

我得到 ts_delta 的值,0x200.但是 scale_factor 的值是 。15.000000基本上我在计算过程中失去了精度。

如何在不丢失精度的情况下做到这一点。?

这是一个关于我如何尝试打印的简短自包含示例。

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main()
{
        uint64_t ts_1 = 0x5212cb03ca115ac0;
        uint64_t ts_2 = 0x5212cb03ca115cc0;
        uint64_t ts_delta = (ts_2 - ts_1);
        double scale_factor = ((double)ts_delta) / (((uint64_t)1) << 32);

        printf("ts_delta %"PRIx64" scale factor %f \n",ts_delta,scale_factor);

        return 0;
}
4

2 回答 2

3

你没有做你认为你正在做的计算。^C 中的运算符执行幂运算,它执行按位异或。你实际上是ts_delta除以2 xor 32 == 34。我不知道你是怎么从中得到15.000000的,它应该已经出来了15.058823529411764

你想做的计算用 C 表示,如下所示:

double scale_factor = ((double)ts_delta) / (((uint64_t)1) << 32);

编辑:从另一个答案:如果您的编译器支持 C99 的十六进制浮点文字,您也可以编写

double scale_factor = ts_delta * 0x1p-32;

以这种方式编写,不需要强制转换,因为乘法的一侧已经是 a double,所以另一侧的整数将被转换为匹配。不幸的是,一些编译器uint64_t没有 C99 的其他特性,例如最近的 MSVC。

于 2013-08-28T23:29:10.237 回答
2

您需要计算浮点值,并获得用于提高幂权的表达式。您可以使用标准功能ldexp

#include <math.h>

double scale_factor = ldexp(ts_2 - ts_1, -32)

或者只是乘以一个常数(感谢@Eric Postpischil!):

double scale_factor = (ts_2 - ts_1) * 0x1p-32;
于 2013-08-28T23:32:28.010 回答