我需要将两个32位浮点数转换为一个64位数字,反之亦然C.在 实现此目的的最佳方法是什么?将两个32位浮点数转换为一个64位数字,反之亦然
我对最好的方法有点困惑,如果我应该从32位的浮点数转换为64位的长浮点数,反之亦然。
帮助赞赏。
我需要将两个32位浮点数转换为一个64位数字,反之亦然C.在 实现此目的的最佳方法是什么?将两个32位浮点数转换为一个64位数字,反之亦然
我对最好的方法有点困惑,如果我应该从32位的浮点数转换为64位的长浮点数,反之亦然。
帮助赞赏。
如果你在谈论他们数学莫名其妙地结合(如加法),你只需他们两个强制到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
虽然你应该记住,这样的行为(type punning)是根据它是否可以工作来定义的。在任何情况下,如果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;
}
OP表示他们希望能够从“* 64位数*”恢复到32位浮点数。第一个解决方案(add)不可能。我想他们想要的东西就像你的解决方案#2。 – ArjunShankar 2012-08-06 08:44:55
@ArjunShankar:好的,我没有注意到这个问题。调整后的答案以澄清。 – paxdiablo 2012-08-06 09:05:04
这取决于如何“两个32位浮点”的关系:他们是两个独立的价值观?或者是其中的一个64位值分裂? – wallyk 2012-08-06 08:24:38
你想将两个32位浮点数存储在一个64位双精度浮点数中吗? – 2012-08-06 08:37:11
你想把它转换成什么样的64位数?为什么? – ArjunShankar 2012-08-06 08:38:04