如果C编译器的printf运行时支持十六进制浮点输出,下面是一个测试,您可以尝试查看文本转换函数之间的差异:
Python:Python 2.7.10 (default, Aug 24 2015, 14:04:43)
[GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = float(0.3)
>>> a.hex()
'0x1.3333333333333p-2'
C:
^{pr2}$
编译的C程序的输出:
0x1.333334p-2
注意,输出中的单位last place(ULP)相差1,Python生成的float看起来像IEEE double。在
有轻微的ULP差异是正常的。它只是向您展示了运行库如何转换浮点数和处理舍入的不同之处。在
或者,您可以在Python源代码中使用十六进制常量打印它们:
#include
int main(void)
{
float y = 0x1.333334p-2;
printf("%f\n", y);
return 0;
}
或者:
#include
int main(void)
{
float y = 0x1.333334p-2;
double z = 0x1.3333333333333p-2;
printf("y = %f\n", y);
printf("z = %f\n", z);
return 0;
}
输出:
y = 0.300000
z = 0.300000