Python和c语言之间的不同浮点计算

fykwrbwg  于 2023-01-01  发布在  Python
关注(0)|答案(2)|浏览(134)

在python和c中浮点数的减法是不一样的,当我尝试“0.3 - 0.1”时,c告诉我0.2,python告诉我0.199999...98。
我写了下面的c代码:

// a.c

#include <stdio.h>

#include <stdlib.h>

int main(int argc, char **argv)

{

  double a, b;

  a = strtod(argv[1], NULL);

  b = strtod(argv[2], NULL);

  printf("%lf, %lf, %lf\n", a, b, a - b);

  return 0;

}

我计算出0.3 - 0.1

> gcc a.c -O3

> ./a.out 0.3 0.1

  0.300000 0.100000 0.200000

目前看来还不错。
但是当我在python中计算时:

# idle

>>> 0.3 - 0.1

0.19999999999999998

为什么?为什么两者的行为不同?有什么方法可以改进Python吗?或者Python的作者已经尽了最大的努力?

zdwk9cvp

zdwk9cvp1#

为什么?为什么两者的行为不同
因为在C语言中使用printf%lf说明符打印浮点数时,会打印小数点后6位数的精度,而在Python中,打印数字时使用的是“表示实际值所需的高精度”,请参阅https://docs.python.org/3.7/library/string.html#formatspec和https://en.cppreference.com/w/cpp/io/c/fprintfPrintf width specifier to maintain precision of floating-point value
有什么方法可以改进Python吗?
如果“改进”这个词是指从python中获得与C代码相同的输出,那么您应该正确地格式化它。要获得与C代码 * 应该 * 输出的相同的输出,您可以:

>>> print("{:f}, {:f}, {:f}".format(0.3, 0.1, 0.3 - 0.1))
0.300000, 0.100000, 0.200000

Python的作者们已经尽力了吗
我强烈认为他们做到了。他们正在免费提供一个惊人的项目,这太惊人了。考虑支持他们,见https://www.python.org/about/help/

3vpjnl9f

3vpjnl9f2#

没有区别,在C中打印更多的数字,你会看到printf只是对值进行了四舍五入。

printf("%.20f, %.20f, %.20f\n", a, b, a - b);

https://godbolt.org/z/Mf5cr96d4

相关问题