【问题标题】:Convert Float to Integer Equivalent将浮点数转换为等效整数
【发布时间】:2011-03-12 23:49:09
【问题描述】:

我想将浮点用户输入转换为其等效整数。我可以通过接受输入字符串来做到这一点,比如“-1.234”,然后我可以显式地将每个字符转换为其十进制表示。 (顺便说一下大端)。所以我只想说我给出的例子,

-1.234 = 1|01111111|00111011111001110110110

sign bit = 1 = 128<<31
exponent bits = 01111111 = 127<<23
mantissa bits = 00111011111001110110110 = 1962934
decimal equivalent = 1962934 + 127<<23 + 128<<31

这很简单,但很笨拙。有一个更好的方法吗?也许我可以做某种类型转换?

【问题讨论】:

  • 整数等值是什么意思?
  • 是的,这里有点模糊,等效我的意思是浮点数的 32 位二进制表示的整数等效。至于我的接受,我会接受的。

标签: c++ floating-point integer


【解决方案1】:
float a = -1.234;
int b = *(int*)&a;

此外,在 C++ 中,有一个不做任何检查的转换运算符reinterpret_cast。这里可能会更好。

int b = *reinterpret_cast<int*>(&a);

【讨论】:

  • 至少在 g++ 中我很确定你必须禁用严格别名才能使其始终有效。
【解决方案2】:

联合可以让您以不同的类型访问同一块内存

union floatint
{
   float f;
   int i;
}

floatint fi;
fi.f=-1.234;
int i=fi.i;

警告:由于大小和对齐方式,您可能会遇到奇怪的平台差异以及类似的事情,但是由于您已经通过尝试将浮点数解释为 int 做出了一些假设,因此您可能能够侥幸逃脱.阅读有关工会的更多信息,我认为这就是您想要的。

【讨论】:

  • 这是我在 verilog/c++ 中设计的处理器模拟的“OS”部分。我设计的处理器严格遵循 MIPSI ISA,并且我还定义了遵循大端约定的架构,所以只要我提供我提到的整数等效类型,我认为我不必担心其他任何事情.
  • 注意,这仅适用于将浮点位模式存储在 int 中。 (因为所有位模式都对 int 有效)而如果将 int 的位模式存储在 float 中,它可能会被更改,因为编译器会重新解释它以用于 float 格式。例如,int 0xff810000 在分配为浮点类型时将更改为 0xffc10000。将 0xff810000(据我所知)存储在浮点数中的唯一方法是使用 memcpy。这样编译器只是复制原始字节,而不是重新解释/纠正浮点存储的值。
【解决方案3】:

重新解释位模式的标准方法是使用 memcpy。如果我没记错的话,gcc 允许指针类型转换 *(int*)&amp;a 作为扩展名,但标准不能保证它,并且不适用于所有编译器。同样,工会也不能保证工作。

#include <stdio.h>
#include <string.h>

float f = -1.234;
int i;
memcpy(&i, &f, sizeof i);
printf("bit pattern is: %d\n", i);

通过优化,对memcpy的调用将从生成的机器码中完全消除。

【讨论】:

  • 我知道这是一个 C++ 问题,但由于您的答案可以被解读为 C 答案,因此我会指出联合保证可以在 C 中工作。脚注C99TC3 中的 82 明确允许它们用于这种实现定义的类型双关。
【解决方案4】:

如果您需要转换一个简单的值,而不需要额外的变量:

#define float_to_int(f) (*reinterpret_cast<const int*>(&static_cast<const float&>(f)))

【讨论】:

    猜你喜欢
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多