将存储在整数中的浮点数的内部表示转换为实际的浮点数
Convert the internal representation of a float stored in an integer to an actual float
我将 float
的内部表示存储在 uint32_t
中。假设我们有两个符合这些条件。我想将 uint32_t
表示的两个 floats
相加,然后将它们的内部表示存储在另一个 uint32_t
中。我一直在尝试一些事情,但我不确定是否有一种简单或标准的方法可以做到这一点。从我的角度来看,有两个问题:
- 将存储在
uint32_t
中的内部表示转换为float
(否则我不知道如何求和)。
- 求和后,将得到的
float
内部表示存储在 uint32_t
. 中
我一直在研究 C 库中的函数,也许可以用 printf
或 atof
来完成,但我没有设法解决它。
嗯,终于用memcpy()解决了。我不完全确定它是否完全可靠,但我认为它很好用。
//Generate the floats
float a = 1.0;
float b = 2.1;
uint32_t x;
uint32_t y;
//Copy the internal representation to x, y
memcpy(&x, &a, sizeof(float));
memcpy(&y, &b, sizeof(float));
//This would be the starter point of the problem described above
float c, d;
memcpy(&c, &x, sizeof(float));
memcpy(&d, &y, sizeof(float));
float r = c + d;
printf("The number is %f\n", r);
打印出来的数字是预期的 3.1000。
我不明白你为什么使用类型化语言将东西存储在不兼容的容器中,但让我们看看这是否对你有帮助:
union flt_int {
float f;
uint32_t i;
};
...
union flt_int a, b;
a.i = val1; /* val1 is the integer internal rep of a float */
b.i = val2; /* idem. */
c.f = a.f + b.f; /* use the floating point representation to add */
/* now you have in c.i the internal representation of the
* float sum of a and b as a uint32_t */
我将 float
的内部表示存储在 uint32_t
中。假设我们有两个符合这些条件。我想将 uint32_t
表示的两个 floats
相加,然后将它们的内部表示存储在另一个 uint32_t
中。我一直在尝试一些事情,但我不确定是否有一种简单或标准的方法可以做到这一点。从我的角度来看,有两个问题:
- 将存储在
uint32_t
中的内部表示转换为float
(否则我不知道如何求和)。 - 求和后,将得到的
float
内部表示存储在uint32_t
. 中
我一直在研究 C 库中的函数,也许可以用 printf
或 atof
来完成,但我没有设法解决它。
嗯,终于用memcpy()解决了。我不完全确定它是否完全可靠,但我认为它很好用。
//Generate the floats
float a = 1.0;
float b = 2.1;
uint32_t x;
uint32_t y;
//Copy the internal representation to x, y
memcpy(&x, &a, sizeof(float));
memcpy(&y, &b, sizeof(float));
//This would be the starter point of the problem described above
float c, d;
memcpy(&c, &x, sizeof(float));
memcpy(&d, &y, sizeof(float));
float r = c + d;
printf("The number is %f\n", r);
打印出来的数字是预期的 3.1000。
我不明白你为什么使用类型化语言将东西存储在不兼容的容器中,但让我们看看这是否对你有帮助:
union flt_int {
float f;
uint32_t i;
};
...
union flt_int a, b;
a.i = val1; /* val1 is the integer internal rep of a float */
b.i = val2; /* idem. */
c.f = a.f + b.f; /* use the floating point representation to add */
/* now you have in c.i the internal representation of the
* float sum of a and b as a uint32_t */