简单的六角/浮动转换

时间:2010-03-11 17:03:58

标签: c++ python formatting floating-point hex

我在c ++和python程序之间做一些输入/输出(只有浮点值)python有一个很好的功能,可以将浮点值转换为十六进制数,然后返回,如下所示:

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

在C ++中有一种简单的方法可以达到类似的效果吗?并将python输出转换回C ++ double / float?这样我在两个进程之间交换数据时就不会出现舍入错误的问题......

谢谢答案!

7 个答案:

答案 0 :(得分:5)

从您在问题中提供的链接(Additional Methods on Float):

  

此语法与语法类似   在第6.4.4.2节中规定   C99标准,还有语法   用于Java 1.5及以上版本。在   特别是float.hex()的输出   可用作十六进制   C或Java中的浮点文字   代码和生成的十六进制字符串   由C的%格式字符或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

答案 1 :(得分:2)

你能在两者之间发送原始二进制数据而不是字符串吗? Python标准库的struct包可以将原始数据解压缩到Python浮点对象中。

答案 2 :(得分:1)

那里的文档说%a在C中这样做。

答案 3 :(得分:1)

如果你相信这会解决你所有的问题,那你就错了。十六进制表示法与原始浮点数完全相同。它只是使用不同的表示。

答案 4 :(得分:1)

C ++没有任何用于将十六进制转换为浮点的库例程。一个原因是浮点的内部表示没有标准化(尽管许多编译器确实使用IEEE标准)。

我建议以ASCII格式存储,这种格式可跨平台移植。您可以编写自己的库(或查找另一个),它将在IEEE格式(十六进制)与内部表示之间进行转换。

答案 5 :(得分:1)

如果您使用的是其系统C库支持C99的平台,则只需将printf( )scanf( )%a格式说明符一起使用即可。要阅读此类值,您还可以使用C99 strtod( )strtof( )strtold( )函数:

float value = strtof(string, NULL, 0);

您可以选择将NULL替换为char **以取回指向转换字符序列末尾的指针,并0使用已知的字符串表示形式(如果你将基数设置为零,它将从格式推断出基数;它将解析python hex floats就好了,并且还处理正常的十进制格式浮点数)

如果您的编译器/库供应商选择不关心C99(基本上是MSVC),那么在将这些功能合并到C ++标准之前,您可能会运气不好(我相信它们在草案C +中) + 0x,但我不完全确定。)

答案 6 :(得分:0)

C ++ 11提供了std :: hexfloat:IO manipulators including hexfloat

如果你可以使用C ++ 11,那么hexfloat非常容易使用。