【问题标题】:Convert two 32 bit floats to one 64 bit number and vice versa将两个 32 位浮点数转换为一个 64 位数字,反之亦然
【发布时间】:2012-08-03 05:11:34
【问题描述】:

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

对于最好的方法以及是否应该从 32 位的浮点数转换为 64 位的长整数(反之亦然),我有点困惑。

帮助表示赞赏。

【问题讨论】:

  • 这取决于“两个 32 位浮点数”是如何关联的:它们是两个独立的值吗?还是在它们之间拆分了一个 64 位值?
  • 你想将两个 32 位浮点数存储在一个 64 位双精度数中吗?
  • 您想将它们转换成什么 种类 的 64 位数字?为什么?
  • “将两个 32 位浮点数转换为一个 64 位数字”没有进一步解释是没有意义的。这里指的是什么类型的转换?

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


【解决方案1】:

如果您要以某种方式将它们在数学上组合(例如加法),您可以先将它们强制转换为 64 位:

float pi = 3.141592653589;
float e  = 2.718281828459;
double sum = (double)pi + (double)e;

我猜这不是你想要的,因为正如有人在 cmets 中指出的那样,如果你所拥有的只是它们的总和,那么很难恢复到原始值。


如果您只是按顺序组合位,则可以执行以下操作:

#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(换句话说,使用 @ 987654327@ 并去掉封闭的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 位浮点数。这对于第一个解决方案(添加)是不可能的。我猜他们想要的是你的解决方案#2。
  • @ArjunShankar:好点,我实际上并没有在问题中注意到这一点。调整答案以澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 2016-06-01
  • 2013-11-11
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 2020-05-09
相关资源
最近更新 更多