python - Python C++浮点数学表示错误

原文 标签 python c++ floating-point

在C++中,

double x = 1.0; 
double y = x / 3.0; 
if (x == y * 3.0)
  cout << " They are equal!" ; 
else
  cout << " They are NOT equal." ;

将打印
‘They are NOT equal.’ 

如所料,由于1/3是有限大小尾数(二进制)的非精确表示。
但在python中(onhttps://repl.it/repls/MessyJaggedMouse),
x = 1.0
y = x / 3.0
x == y * 3.0

印刷品
True

python何时以及为什么会偏离上述预期行为?编辑:巨蟒不会离开-请看下面我的回答。

最佳答案

只有当我在C语言中使用x87数学时,这种情况才会发生。
正确的四舍五入,使用ieee 754双算术,你将得到真。
但是,如果以更高的精度计算中间值,则可能会得到false。不需要C来计算64位精度的所有中间值,在32位x86处理器上,使用x87浮点指令时,最终将使用较大的80位浮点类型作为中间值。根据启用的优化设置和编译器的详细信息,计算将以不同的方式进行(使用不同的中间值),您将得到稍微不同的结果。

#include <cstdio>

int main() {
  double x = 1.0;
  double y = x / 3.0;
  std::printf("x == y * 3.0: %s\n", x == y * 3.0 ? "true" : "false");
  return 0;
}

如果使用gcc编译,我会看到false。如果编译时不使用-mfpmath=387 -O0(在amd64上默认为sse),或者编译时使用true,我会看到-mfpmath=387
您可以看到它是如何使用godbolt上的x87指令编译的:https://godbolt.org/z/rf1Rir——尝试添加-O2或删除-O2以查看它如何影响生成的代码。
注意,这有点巧合-mfpmath=387。您可以在python中测试以下代码,例如:
1.0 / 49.0 * 49.0 == 1.0

这应该给出(1.0 / 3.0) * 3.0 == 1.0

相关文章:

python - Scrapy:如何从spider_idle事件回调中手动插入请求?

python - 这是在python中编码和解码字符串的安全方法吗?

c++ - C ++超类为子类定义静态成员变量

c++ - C ++ IsFloat函数

python - 检查python int是否太大而无法转换为float

java - 是否有Java等效的frexp?

python - 在大文件中搜索文本并将结果写入文件

python - 我如何从不同的群体获得相似的分布?

c++ - 如何使用运算符否定谓词函数!在C ++中?

c++ - 如何在编译C ++代码时解决某些版本控制问题?