2012-08-06 163 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

相關問題