请问这个数学式子怎么计算出正确答案

gif

约等于 3.1406
但是 用 python 计算出的值是错误的

In [1]: from math import sqrt

In [2]: ((1+1/sqrt(2))/2 + sqrt(1/sqrt(2)))**2 / 4*(0.25-(1-((1+1/sqrt(2))/2))**2)
Out[2]: 0.16405334649243114

发现分开计算分子分母 再做除法 就正确
合在一起就不行 什么鬼

In [1]: from math import sqrt

In [2]: a = ((1+1/sqrt(2))/2 + sqrt(1/sqrt(2)))**2

In [3]: b = 4*(0.25-(1-((1+1/sqrt(2))/2))**2)

In [4]: a
Out[4]: 2.8711601445348967

In [5]: b
Out[5]: 0.914213562373095

In [6]: a/b
Out[6]: 3.1405792505221686

In [7]: ((1+1/sqrt(2))/2 + sqrt(1/sqrt(2)))**2 / 4*(0.25-(1-((1+1/sqrt(2))/2))**2)
Out[7]: 0.16405334649243114

个人感觉还是尽量用括号来明确指定运算顺序比较好

正确结果:2.8711601445348967 / (4*(0.25-(1-((1+1/sqrt(2))/2))**2))
您提问中的错误结果:2.8711601445348967 / 4*(0.25-(1-((1+1/sqrt(2))/2))**2)

另外编程过程中应该尽量注意数据类型一致,比如您代码中的整数应该用浮点数代替,比如1用1.代替2用2.代替

1 个赞

傻眼了 还真是打错了…想找地缝钻进去 :flushed::flushed::flushed::flushed::flushed::flushed::flushed::flushed::flushed::flushed::flushed::flushed::flushed::flushed::flushed::flushed:

刚才突然想到浮点数精度问题 还自以为找到原因了 原来是这样…

我用的 python3 应该默认是小数除法 :flushed:

找到一篇文章不错 分享以下
http://ta.twi.tudelft.nl/nw/users/vuik/wi211/disasters.html

关于这篇文章的讨论
https://news.ycombinator.com/item?id=8980134

1 个赞

默认归默认,但中间还是会就进行自动的类型转换,实际编程中进行自动类型转换一不小心就会留坑.
所以要么保持数据类型一致且不期望发生转换,要么就手动转换.
当然就具体您这个例子而言这么用没问题,但确保保持数据类型一致是避免坑的好习惯.

1 个赞

数据单位一致性,这种问题很大的。
尤其是统计什么时效之类的,一不小心就偏离了。

谢谢建议 前段时间学了 golang 以后对静态语言也有了一点了解