2012-08-06 228 views
1

我需要将两个32位浮点数转换为一个64位数字,反之亦然C.在 实现此目的的最佳方法是什么?将两个32位浮点数转换为一个64位数字,反之亦然

我对最好的方法有点困惑,如果我应该从32位的浮点数转换为64位的长浮点数,反之亦然。

帮助赞赏。

+0

这取决于如何“两个32位浮点”的关系:他们是两个独立的价值观?或者是其中的一个64位值分裂? – wallyk 2012-08-06 08:24:38

+0

你想将两个32位浮点数存储在一个64位双精度浮点数中吗? – 2012-08-06 08:37:11

+0

你想把它转换成什么样的64位数?为什么? – ArjunShankar 2012-08-06 08:38:04

回答

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 

虽然你应该记住,这样的行为(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; 
} 
+0

OP表示他们希望能够从“* 64位数*”恢复到32位浮点数。第一个解决方案(add)不可能。我想他们想要的东西就像你的解决方案#2。 – ArjunShankar 2012-08-06 08:44:55

+0

@ArjunShankar:好的,我没有注意到这个问题。调整后的答案以澄清。 – paxdiablo 2012-08-06 09:05:04

相关问题