浮点转十六进制

  • 格式:doc
  • 大小:26.00 KB
  • 文档页数:4

这几天一直在弄postgre的数据写入,特别是几何数据的写入。

在几何数据的写入过程中,可以有多种
通过WKB,TEXT都是可以的。

先觉得,通过Text建立会比较慢,因为要用到geometryfromtext,与把数据转换成文本再让数据库进行转换,不如自己进行转换成 WKB形式的
第一段的难点就是将double类型转换成十六进制字符串,就是将64bit转换成16进制字符串表示。

首先学习了IEEE754标准,了解浮点函数的编码方式。

void TestDouble(double value)
{
int count=0;
string x;
if (value>0)
{
x+="0"; //判断符号
}
else
{
x+="1";
value=-value;
}
while (2<=value) //获得小数点后值
{
value=value/2.0;
count++;
}
count=count+1023; //将阶码变成二进制表示
bitset<11>code(count);
x+=code.to_string(); //前半部分二进制表示
int digit=-1;
value-=1.0;
/**///////////////////////////////////////////////////////////////////////////将数值用二进制表示/////
double posval=0.0;
double tempval=0.0;
while (value!=0&&digit>-54)
...{
posval=Power(2,digit);
tempval=value-posval;
if(tempval>0)
...{
x+="1";
value=tempval;
}
else if (tempval==0)
...{
x+="1";
break;
}
else
x+="0";
--digit;
}
int size=64-x.size();
if (size>0)
...{
char* temp=new char[size];
memset(temp,'0',size);
x.append(temp,size);
delete temp;
}
cout<<binTohexstr(x)<<endl;
}
static string binTohexstr(string temp) ...{
string value="";
if (temp.size()%4!=0)
...{
return NULL;
}
while ((temp.size()-4)>0)
...{
value+=binTohex(temp.substr(0,4)); temp=temp.substr(4,temp.size()-4); }
value+=binTohex(temp);
return value;
}
static char binTohex(string temp)
...{
if("0000"==temp)
return '0';
else if("0001"==temp)
return '1';
else if("0010"==temp)
return '2';
else if ("0011"==temp)
return '3';
else if("0100"==temp)
return '4';
else if("0101"==temp)
return '5';
else if("0110"==temp)
return '6';
else if("0111"==temp)
return '7';
else if("1000"==temp)
return '8';
else if("1001"==temp)
return '9';
else if("1010"==temp)
return 'A';
else if("1011"==temp)
return 'B';
else if("1100"==temp)
return 'C';
else if("1101"==temp)
return 'D';
else if("1110"==temp)
return 'E';
else if("1111"==temp)
return 'F';
else
return 'G';
}上面是整个转换到流程,先转换成二进制,难点在于理解double值得表示方式为
value=(1+m)*2n其中2n表示2的n次方。

首先求出2的阶码,double的阶吗有12位,就是2048次方,但是double还有表示小数后的值,所以要表示-1023~1024的值,就要进行转换。

得到的值都是需要进行移位,3.5=(1+0.75)×2;所以阶吗就是1+1023=1024,就是10000000。

另外double 的第一位是符号位,0是正,1是负。

(1+m)中的M是大于0小于1的。

这个M 是value不断被2除得到大于1小于2的数字,又因为double里面的数都是默认加个1,所有得到m。

m再用小数表示,得到结果。