将两个32位浮点数转换为一个64位数,反之亦然

时间:2012-08-06 08:22:49

标签: c floating-point 64-bit 32bit-64bit type-conversion

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

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

帮助表示赞赏。

1 个答案:

答案 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;
}