C++ C+中浮点到基数2科学记数法(IEEE 32位)的算法或代码+;?

C++ C+中浮点到基数2科学记数法(IEEE 32位)的算法或代码+;?,c++,algorithm,floating-point,ieee-754,C++,Algorithm,Floating Point,Ieee 754,我把一个浮点数作为输入,然后输出它的等价表示形式,用2进制的科学记数法。这是在IEEE 32位中:31符号位,23-30指数(127偏移),0-22尾数(隐式前导1) 其中一个我不太确定的条件是“你的尾数应该有隐含的前导1。” 我真正学到的是将浮点分解为小数部分和小数部分,分别得到它们的二进制表示形式 因为我不知道该怎么做。。。我真的无法编写代码。如果您能给我一些提示或信息,介绍一些算法,或者代码本身,我将不胜感激。谢谢 样本: Input: -40.1 Output: -1.010000001

我把一个浮点数作为输入,然后输出它的等价表示形式,用2进制的科学记数法。这是在IEEE 32位中:31符号位,23-30指数(127偏移),0-22尾数(隐式前导1)

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

我真正学到的是将浮点分解为小数部分和小数部分,分别得到它们的二进制表示形式

因为我不知道该怎么做。。。我真的无法编写代码。如果您能给我一些提示或信息,介绍一些算法,或者代码本身,我将不胜感激。谢谢

样本:

Input: -40.1
Output: -1.01000000110011001100110 E101

Input: 13.5
Output: 1.10110000000000000000000 E11

编辑:127偏移意味着超过127符号,对吗?我的书只有多余的128本,但我不知道有什么区别…

你可以作弊,直接使用。

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

#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;
}
#包括
使用名称空间std;
工会b{
漂浮物;
整数;
};
int main(){
b事物;
flo=-40.1;
对于(int i=31;i>=0;i--){

if((thing.integ&(1最干净的方法之一是使用位掩码。也许更好的方法是使用位字段。您可以定义一个结构来表示浮点格式:

struct float_layout {
  int mantisa : 23
  int exp : 8
  int sign : 1
};
然后获取您的float,并将其强制转换到此结构:

float b = input;
float_layout layout = *static_cast<float_layout *>(&b)
float b=输入;
浮动布局=*静态投影(&b)
这将在不更改数据位的情况下重新解释数据位。然后您可以轻松地以数字形式访问部分。只需记住为exp添加偏移量,并为尾数添加前导1。

\35; include
#include <iostream>

//float:1:8:23, bias 127
typedef union {
    float f;
    unsigned int ui;
    unsigned char c[4];
} Fl_u;
/*    
bool isLittleEndian(){
    Fl_u x;
    x.f = -0.0;
    return x.c[3] == 0x80;
}
*/
void fbinprint(float f){
    Fl_u x;
    unsigned wk=0;
    x.f = f;
/*  if(isLittleEndian())
        for(int i=3;i>=0;--i)
            wk = (wk << 8) + x.c[i];
    else
*/      wk = x.ui;
    if(wk & 0x80000000)
        std::cout << '-';
    unsigned bit = wk & 0x07FFFFF;
    std::cout << "1.";
    for(int i = 0; i< 23 ; ++i){
        bit <<=1;
        std::cout << (bit & 0x0800000 ? '1' : '0');
    }
    std::cout << " E";
    int exp = (wk >> 23) & 0x0FF;
    exp -= 127;//bias 127
    if(exp < 0){
        std::cout << '-';
        exp = -exp;
    }
    int i = 0;
    while((exp & 0x080) == 0 && i < 8){//skip zero of top
        exp <<= 1;
        ++i;
    }
    if(i == 8)
        std::cout << '0';
    for(;i< 8 ; ++i){
        std::cout << (exp & 0x080 ? '1' : '0');
        exp <<=1;
    }
    std::cout << std::endl;
}

int main(){
    float f = -40.1;
    std::cout << "Input: " << f << std::endl;
    std::cout << "Output: ";
    fbinprint(f);
    std::cout << std::endl;
    f = 13.5;
    std::cout << "Input: " << f << std::endl;
    std::cout << "Output: ";
    fbinprint(f);
//  fbinprint(0.0625);
}
//浮动:1:8:23,偏差127 typedef联合{ 浮动f; 未签名的INTUI; 无符号字符c[4]; }弗劳; /* 布尔伊斯利特林迪安(){ flux; x、 f=-0.0; 返回x.c[3]==0x80; } */ 无效fbinprint(浮动f){ flux; 无符号wk=0; x、 f=f; /*if(isLittleEndian()) 对于(int i=3;i>=0;--i)
wk=(wk在维基百科上有一个很好的解释:和。你可能会发现这篇文章很有帮助:。在这篇文章中,我展示了如何在C中完成双打。@kevin:这是一个家庭作业练习吗?如果是,请添加“家庭作业”注意你的问题……如果这是作弊,我不想知道正确答案是什么。@Potatoswatter:好吧,如果练习是为了理解浮点的表示方式,那么拥有一个现成的函数来为你做这件事可能被认为是作弊!@Oli:依我看,理解frexp的结果需要理解FP fundamentals…剩下的就是位布局,这取决于尾数。原则上很好,但要求您知道
float
s在平台上的存储顺序。我可能误解了标准,但我认为它指定了如何存储。