c++ - C++ 中以 2 为基数的科学记数法(IEEE 32 位) float 的算法或代码?

标签 c++ algorithm floating-point ieee-754

我将一个 float 作为输入,然后以 2 进制科学记数法输出它的等价表示。这是 IEEE 32 位,具有:31 个符号位、23-30 个指数(具有 127 个偏移量)、0-22 个尾数(隐式前导 1)。

我不太确定其含义的条件之一是“您的尾数应该有隐含的前导 1”。

我真正学到的是将 float 分解成小数部分和小数部分,并分别获得它们的二进制表示。

因为我不确定该怎么做...我真的无法编写代码。我将不胜感激有关某种算法或代码本身的任何提示或信息。谢谢。

示例:

Input: -40.1
Output: -1.01000000110011001100110 E101

Input: 13.5
Output: 1.10110000000000000000000 E11

编辑:127 偏移量意味着超出 127 符号对吗?我的书只有多余的128,反正我也不知道有什么区别...

最佳答案

所以我不会为您做所有的工作,因为这听起来像是家庭作业。但我会让你开始,你可以填补空白。所以在 c++ 中有一个方便的数据类型,称为 union ,使用它你可以让多个数据类型占用相同的空间。这非常有用,如果您想查看 float 的位表示。以下代码将输出 float 的二进制表示:

#include <iostream>
using namespace std;
union b{
   float flo;
   int integ;
};
int main(){

  b thing;
  thing.flo=-40.1;
  for(int i=31;i>=0;i--){
    if((thing.integ & (1 << i)))
      cout << 1;
    else
      cout << 0;
  }
  cout << endl;
}

剩下您要做的就是提取尾数和指数。您可以运行例程一次以生成尾数,然后再运行一次以生成指数。我将简要说明如何执行这两项操作以及需要注意的事项。

当生成尾数时,请记住 IEEE 使用隐藏的 1 和零的保留代码,因此总会有一个不在位表示中的额外的 1。基本上你会检查符号位打印 - 或 + 取决于它,然后 1. 然后跳到尾数并打印后面的内容。然后你会回到 23-30 位,你想把它转换成一个 int,这样做每个位乘以 2^i(23 位是 0,24 位是 1,等等)然后你会想要从 int 中减去偏移量。然后使用之前的大纲方法输出指数的二进制表示,我会考虑在你达到 1 之前不输出。希望这有帮助。

关于c++ - C++ 中以 2 为基数的科学记数法(IEEE 32 位) float 的算法或代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3850842/

相关文章:

arrays - Ruby算法求解

将 double 转换为整数?

c - 剖析 C 中的浮点用法

c++ - C/C++ static const 局部变量的用途

c++ - 如何使用 boost C++ property map 从配置文件中提取值

c++ - 在 NetBeans 7.2 中找不到 io.h

c++ - 为噪声信号寻找实时可靠和精确的峰值检测算法

c++ - static const int 成员和 undefined reference

c++ - 晶格缩减

mysql - 在 MySQL 中格式化小数,不带前导 0