我需要将两个32位浮点数转换为一个64位数字,反之亦然。 实现这一目标的最佳方法是什么?
我对最好的方法感到有点困惑,如果我应该从32位的浮点数转换为64位的长位数,反之亦然。
帮助表示赞赏。
答案 0 :(得分:4)
如果您正在谈论以某种方式(例如添加)以数学方式将它们组合在一起,您可以先将它们强制转换为64位:
float pi = 3.141592653589;
float e = 2.718281828459;
double sum = (double)pi + (double)e;
我猜这是不你想要什么,因为正如有人在评论中指出的那样,如果你拥有的只是它们的总和,那么很难回到原始值。
如果您只是简单地按顺序组合这些位,您可以执行以下操作:
#include <stdio.h>
union {
struct {
float f1;
float f2;
};
double d;
} xyzzy;
int main (void) {
xyzzy.f1 = 3.141592653589;
xyzzy.f2 = 2.718281828459;
double d2 = xyzzy.d;
printf ("%lf\n", xyzzy.d);
xyzzy.f1 = 0;
xyzzy.f2 = 0;
xyzzy.d = d2;
printf ("%f %f\n", xyzzy.f1, xyzzy.f2);
}
输出:
14.985018
3.141593 2.718282
尽管你应该记住,这种行为(类型惩罚)是实现定义的,它是否会起作用。在任何情况下,如果float
值是32位大小和对齐,内部struct
本身几乎肯定是64位,您可以使用它而不是double
(在换句话说,使用struct
并删除封闭的union
)。
如果您想要一些可以帮助您完成工作的功能,请参阅下文:
#include <stdio.h>
double cvtToDbl (float n1, float n2) {
struct { float n1; float n2; } s;
s.n1 = n1;
s.n2 = n2;
return *((double*)&s);
}
void cvtToFlts (double d, float *pn1, float *pn2) {
struct { float n1; float n2; } *ps = (void*)&d;
*pn1 = ps->n1;
*pn2 = ps->n2;
}
int main (void) {
float f1 = 0, f2 = 0;
double d = cvtToDbl (3.141592653589, 2.718281828459);
printf ("%lf\n", d);
cvtToFlts (d, &f1, &f2);
printf ("%f %f\n", f1, f2);
return 0;
}