在python中,假设代码为:
import.math
a = math.sqrt(2.0)
if a * a == 2.0:
x = 2
else:
x = 1
答案 0 :(得分:2)
这是&#34的变体;浮点数是近似值 - 不完全"。
从数学上讲,你是正确的sqrt(2)* sqrt(2)== 2.但sqrt(2)可以不完全表示为本机数据类型(读取:浮点数)。 (Heck, the sqrt(2) is actually guaranteed to be an infinite decimal!)。它可以变得非常接近但不准确:
>>> import math
>>> math.sqrt(2)
1.4142135623730951
>>> math.sqrt(2) * math.sqrt(2)
2.0000000000000004
请注意,结果实际上不是正是2。
如果您希望执行x = 2
分支,则需要使用&#34的 epsilon 值;结果是否足够接近?":
epsilon = 1e-6 # 0.000001
if abs(2.0 - a*a) < epsilon:
x = 2
else:
x = 1
答案 1 :(得分:1)
带小数的数字存储为浮点数,在某些情况下它们只能是实数的近似值。
所以你的比较需要不是&#34;这两个数字是否完全相等(==)&#34;但是&#34;他们是否足够接近以至于被视为平等&#34;。
幸运的是,在数学库中,有一个方便的功能。使用isClose(),您可以与定义的容差进行比较。这个功能并不复杂,你可以自己动手。
math.isclose(a*a, 2, abs_tol=0.0001)
>> True