首页 > 解决方案 > Python 到 C 浮点不精确

问题描述

将浮点数从用 Python 创建的 csv 文件导入到用 C 编写的程序时,我遇到了一些精度问题。以下代码是我的程序中发生的示例:Python 将 float32 值写入文件(在本例中为 9.8431373 e+00),我将其读入字符串并用于strtof将其转换回float32,但最后一个小数位的结果不同。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    
    char* a;
    char x[10] = "9.8431373";
    printf("%s\n", x);
    float f = strtof(x,&a);
    printf("%.7e\n", f);
}

输出:

9.8431373
9.8431377e+00

现在,如果我错了,请纠正我,但是floatC 中的一个对象有 32 位,无论它的浮点数在哪里,都会导致 7 个小数位的精度。所以如果我没有声明一个大于浮点数允许的数字,就不应该有任何精度错误。

如果我确实声明了一个比 C 中的浮点数更精确的数字,那么 Python 是如何在不更正的情况下接受“9.8431373e+00”作为 Float32 的?Python 和 C 对 32 位浮点数有不同的标准吗?

标签: pythoncfloating-point

解决方案


Python 默认解释为 double。如果您打包为单精度并再次解包,您将在 Python 中看到相同的问题:

>>> import struct
>>> a = struct.pack('<f', 9.8431373)
>>> b, = struct.unpack('<f', a)
>>> b
9.843137741088867

推荐阅读