#include<iostream>
using namespace std;
void FloatToBuf(float num, unsigned char buf[4]);
float BufToFloat(unsigned char buf[4]);
int main()
{
float f = 639.5f; //待轉換的浮點數
int *p = reinterpret_cast<int *>(&f);
for(int i = 31; i >= 0; i--) //原始的二進制位
{
cout << (*p >> i & 1);
if(i % 8 == 0)
{
cout << ' ';
}
}
cout << endl;
unsigned char buf[4];
FloatToBuf(f, buf);
for(i = 0; i < 32; i++) //轉換後的大端模式二進制位
{
cout << (buf[i / 8] >> (7 - i % 8) & 1);
if(i % 8 == 7)
{
cout << ' ';
}
}
cout << endl;
cout << BufToFloat(buf) << endl; //再轉回去的浮點數
return 0;
}
void FloatToBuf(float num, unsigned char buf[4])
{
float item = 0.5f;
int index = 0, i;
if(num == 0.0f)
{
buf[0] = buf[1] = buf[2] = buf[3] = 0;
return;
}
if(num > 0.0f)
{
buf[0] &= ~(1 << 7);
}
else
{
buf[0] |= (1 << 7);
num *= -1.0f;
}
while(num >= 2.0f)
{
index++;
num /= 2.0f;
}
num -= 1.0f;
for(i = 9; i < 32; i++, item /= 2.0f)
{
if(num >= item)
{
buf[i / 8] |= (1 << (7 - i % 8));
num -= item;
}
else
{
buf[i / 8] &= ~(1 << (7 - i % 8));
}
}
if(num >= item)
{
for(i = 31; i > 8; i--)
{
if(buf[i / 8] >> (7 - i % 8) & 1)
{
buf[i / 8] &= ~(1 << (7 - i % 8));
}
else
{
buf[i / 8] |= (1 << (7 - i % 8));
break;
}
}
if(i == 8)
{
index++;
}
}
index += 127;
for(i = 8; i > 0; i--)
{
if(index >> (8 - i) & 1)
{
buf[i / 8] |= (1 << (7 - i % 8));
}
else
{
buf[i / 8] &= ~(1 << (7 - i % 8));
}
}
}
float BufToFloat(unsigned char buf[4])
{
float sum = 1.0f, item = 0.5f;
int index = 0, base = 1, i;
for(i = 9; i < 32; i++, item /= 2.0f)
{
if(buf[i / 8] >> (7 - i % 8) & 1)
{
sum += item;
}
}
for(i = 8; i > 0; i--, base *= 2)
{
if(buf[i / 8] >> (7 - i % 8) & 1)
{
index += base;
}
}
if(index > 0)
{
index -= 127;
if(index > 0)
{
while(index--)
{
sum *= 2.0f;
}
}
else
{
index *= -1;
while(index--)
{
sum /= 2.0f;
}
}
}
else
{
sum -= 1.0f;
}
if(buf[0] >> 7 & 1)
{
sum *= -1.0f;
}
return sum;
}
C++解析IEEE754中float格式的數據
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.