我在c ++和python程序之间做一些输入/输出(只有浮点值)python有一个很好的功能,可以将浮点值转换为十六进制数,然后返回,如下所示:
http://docs.python.org/library/stdtypes.html#additional-methods-on-float
在C ++中有一种简单的方法可以达到类似的效果吗?并将python输出转换回C ++ double / float?这样我在两个进程之间交换数据时就不会出现舍入错误的问题......
谢谢答案!答案 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非常容易使用。