简单的十六进制/浮点数转换

2 投票
7 回答
5413 浏览
提问于 2025-04-15 20:19

我正在做一个C++和Python程序之间的输入输出(只涉及浮点数)。Python有一个很不错的功能,可以把浮点数转换成十六进制数字,然后再转换回来,具体可以参考这个链接:

http://docs.python.org/library/stdtypes.html#additional-methods-on-float

在C++中有没有简单的方法可以做到类似的事情?也就是把Python的输出转换回C++的double或float?这样我就不需要担心在两个程序之间交换数据时出现的舍入误差问题了……

谢谢大家的回答!

7 个回答

1

C++没有现成的库函数可以把十六进制转换成浮点数。一个原因是浮点数的内部表示方式并没有统一标准(虽然很多编译器确实使用了IEEE标准)。

我建议你使用ASCII格式来存储,这样在不同的平台上都能使用。你可以自己写一个库(或者找一个现成的),来实现从IEEE格式(十六进制)到内部表示的转换。

2

你能在两者之间发送原始的二进制数据,而不是字符串吗?Python的标准库中有一个叫做struct的工具,它可以把这些原始数据转换成Python中的浮点数对象。

5

根据你在问题中提供的链接(浮点数的附加方法):

这种语法和C99标准第6.4.4.2节中的语法很相似,也和Java 1.5及之后版本的语法相似。特别是,float.hex()的输出可以作为C或Java代码中的十六进制浮点字面量使用,而C语言的 %a 格式字符或Java的 Double.toHexString 生成的十六进制字符串可以被float.fromhex()接受。

举个例子:

#include <cstdio>

int main() {
  float f = 42.79;
  printf("%.2f == %a\n", f, f);  
  fscanf(stdin, "%a", &f);
  printf("%.2f == %a\n", f, f);  
}

运行它:

$ g++ *.cpp && (python -c'print 12.34.hex()' | ./a.out )

输出:

42.79 == 0x1.5651ecp+5
12.34 == 0x1.8ae148p+3

撰写回答