64位双精度浮点数转换为IEEE 754 16进制编码

因为做机械臂项目需要提取机械臂坐标,所以当初为了把64位双精度浮点数转换为十六进制可累死我了,看了挺多博客。但后来学长告诉我其实指针地址就是IEEE 754 16进制编码,C可以直接调用就不用写函数计算了,还是自己见识少了。在此分享大家,避免跟我一样多花时间查找相关资料。

原理可参考这里:IEEE 754 16进制编码转为64位双精度浮点数

doubleToHex:
#include
#include
using namespace std;
int main()
{
	double x;
	char str[16];
	cout << "输入浮点数: ";
	cin >> x;
	sprintf(str, "%p", x);
	cout << "十六进制编码:" << str << endl;
}
HexToDouble:

找不到当时参考哪位大佬的了,在此谢谢大佬。我稍微把函数都封装成一个类。

#include 
#include 
#include 
#include 
#include 
using namespace std;

class HexToDouble
{
public:
    static double putin(string temp1)
    {
        int i;
        string temp;
        temp = temp1;
        string S_Bin = "";//转化后的二进制字符串
    //cout<> x;//输入十六进制
   // cin>>z;
    double x1 = HexToDouble::putin(x);
    cout << x1 << endl;
    cin >> y;
    double y1 = HexToDouble::putin(y);
    //double z1=HexToDouble::putin(z);
    cout << y1 << endl;
    //  cout<<"z "<
doubleToHex:

也是找不到当时参考哪位大佬的了,谢谢大佬。我也稍微把函数都封装成一个类了。

#include 
#include 
#include 
#include 
#include 
using namespace std;

class doubleToHex
{
public:
    static 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++;
        }
        while (value < 1)
        {
            value = value * 2;
            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 = pow(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';
    }

};

int main()
{
    double x;
    cin >> x;
    doubleToHex::TestDouble(x);
    return 0;
}

你可能感兴趣的:(项目,经验分享)