我真正需要做的是将一个浮点数导出到C,而不丢失精度。
我用python做的:
import math
import struct
x = math.sqrt(2)
print struct.unpack('ii', struct.pack('d', x))
# prints (1719614413, 1073127582)
在C语言中,我尝试:
#include <math.h>
#include <stdio.h>
int main(void)
{
unsigned long long x[2] = {1719614413, 1073127582};
long long lx;
double xf;
lx = (x[0] << 32) | x[1];
xf = (double)lx;
printf("%lf\n", xf);
return 0;
}
但在C中我得到:
7385687666638364672.000000,非sqrt(2)。
我错过了什么?
谢谢。
repr()是你的朋友。
如果你的目标是一个小的endian架构
如果是big endian,请使用
'>d'
,而不是<d
。不管是哪种情况,这都会给你一个十六进制字符串,就像你在题目中要求的那样,当然C代码可以解释它;我不确定这两个int与“十六进制字符串”有什么关系。Python代码似乎可以工作。问题出在C代码中:您已经把
long long
填好了,但是随后您直接将整数值转换成浮点,而不是将字节重新解释为double
。如果你向它抛出一些指针/地址,它就会工作:还要注意,
double
(和float
)的格式说明符是%f
,而不是%lf
。%lf
用于long double
。相关问题 更多 >
编程相关推荐