c – 双倍到十六进制字符串和十六进制字符串加倍

要做的是将double转换为十六进制字符串然后再转换为double.

以下代码执行转换为双十六进制字符串.

char * double2HexString(double a)
{
   char *buf = new char[17]; // double is 8-byte long,so we have 2*8 + terminating \0
   char *d2c;
   d2c = (char *) &a;
   char *n = buf;
   int i;
   for(i = 0; i < 8; i++)
   {
      sprintf(n,"%02X",*d2c++);
      n += 2;
   } 
   *(n) = '\0';
}

这似乎工作,但是,我不知道如何将结果字符串转换回double.
请指教 :)

解决方法

我很惊讶地看到没有人提出标准解决方案,这是ISO C99标准中的%格式说明符.
#include <iostream>
#include <string>
#include <stdio.h>

std::string double2hexastr(double d) {

  char buffer[25] = { 0 };

  ::snprintf(buffer,25,"%A",d); // Todo Check for errors

  return buffer;
}

double hexastr2double(const std::string& s) {

  double d = 0.0;

  ::sscanf(s.c_str(),"%lA",&d); // Todo Check for errors

  return d;
}


int main() {

  std::cout << "0.1 in hexadecimal: " << double2hexastr(0.1) << std::endl;

  std::cout << "Reading back 0X1.999999999999AP-4,it is ";

  std::cout << hexastr2double("0X1.999999999999AP-4") << std::endl;

}

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...