如何转换一个Python浮动为十六进制字符串在Python 2.5? 非工作的解决方案连接(Ho

2019-06-24 07:48发布

我真正需要做的是一个浮点数出口到C,无精度损失。

我这样做在python:

import math
import struct
x = math.sqrt(2)
print struct.unpack('ii', struct.pack('d', x))
# prints (1719614413, 1073127582)

而在CI试试这个:

#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;
}

但在CI得到:

7385687666638364672.000000和不SQRT(2)。

我在想什么?

谢谢。

Answer 1:

在Python代码似乎工作。 问题是在C代码:你有long long填写正确的,但你直接转换的整数值到浮点,而不是重新解释字节作为double 。 如果你把一些指针/它解决它的工作原理:

jkugelman$ cat float.c
#include <stdio.h>

int main(void)
{
    unsigned long x[2] = {1719614413, 1073127582};
    double d = *(double *) x;

    printf("%f\n", d);
    return 0;
}
jkugelman$ gcc -o float float.c 
jkugelman$ ./float 
1.414214

还要注意的是格式说明为double (以及float )是%f ,而不是%lf%lflong double



Answer 2:

如果您要指定一个小端架构,

>>> s = struct.pack('<d', x)
>>> ''.join('%.2x' % ord(c) for c in s)
'cd3b7f669ea0f63f'

如果大端,使用'>d' ,而不是<d 无论是哪种情况,这给你一个十六进制字符串,只要您的问题标题的要求,当然,C代码可以解释它; 我不知道这两个整数有一个“十六进制字符串”做。



Answer 3:

再版()是你的朋友。

C:\junk\es2>type es2.c
#include <stdio.h>
#include <math.h>
#include <assert.h>

int main(int argc, char** argv) {
    double expected, actual;
    int nconv;
    expected = sqrt(2.0);
    printf("expected: %20.17g\n", expected);
    actual = -666.666;
    nconv = scanf("%lf", &actual);
    assert(nconv == 1);
    printf("actual:   %20.17g\n", actual);
    assert(actual == expected);
    return 0;
    }


C:\junk\es2>gcc es2.c

C:\junk\es2>\python26\python -c "import math; print repr(math.sqrt(2.0))" | a
expected:   1.4142135623730951
actual:     1.4142135623730951

C:\junk\es2>


文章来源: How do I convert a Python float to a hexadecimal string in python 2.5? Nonworking solution attached
标签: python double