python - 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
现在,如果我错了,请纠正我,但是float
C 中的一个对象有 32 位,无论它的浮点数在哪里,都会导致 7 个小数位的精度。所以如果我没有声明一个大于浮点数允许的数字,就不应该有任何精度错误。
如果我确实声明了一个比 C 中的浮点数更精确的数字,那么 Python 是如何在不更正的情况下接受“9.8431373e+00”作为 Float32 的?Python 和 C 对 32 位浮点数有不同的标准吗?
解决方案
Python 默认解释为 double。如果您打包为单精度并再次解包,您将在 Python 中看到相同的问题:
>>> import struct
>>> a = struct.pack('<f', 9.8431373)
>>> b, = struct.unpack('<f', a)
>>> b
9.843137741088867
推荐阅读
- scala - sbt 更改dependsOn中项目的设置
- javascript - 如何解决“推送不是功能”?
- google-cloud-platform - AutoML Vertex AI - 如何为标签和默认值设置连续值?
- python - 我无法使用 Pillow 在 Python 中获取所有元数据标签
- java - 如何部署单类 Wildfly?
- database-administration - 数据库在可用性组中时如何使用数据库快照功能?
- java - Intellij 在实现类中没有看到 Lombok getter 的使用
- javascript - 如何有条件地为顶部选项卡导航器中的文本呈现填充?
- python - 如何从位置而不是名称给出的字段值初始化 Pydantic 对象?
- node.js - 为什么 Clinic.js 和 Autocannon 返回 0 2xx 响应,36164 非 2xx 响应?