浮点数转换到16进制字符串
这几天一直在弄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‘;
}
通过WKB,TEXT都是可以的。先觉得,通过Text建立会比较慢,因为要用到geometryfromtext,与把数据转换成文本再让数据库进行转换,不如自己进行转换成 WKB形式的
第一段的难点就是将double类型转换成十六进制字符串 ,就是将64bit转换成16进制字符串表示。首先学习了IEEE754标准,了解浮点函数的编码方式。

void
TestDouble(
double
value)

{






















































static
string
binTohexstr(
string
temp)

{















static
char
binTohex(
string
temp)

{



















































上面是整个转换到流程,先转换成二进制,难点在于理解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再用小数表示,得到结果