print(pow(3,0.5)*pow(3,0.5)==3)
False
pow的结果是浮点数,浮点数有误差,所以不一定正好等于3啊
python里浮点数是用53位二进制表示的,所以当这样计算时,只能无限接近目标值
浮点数一般都有精度误差,判断浮点是等于的做法应该是 abs(浮点是 - 某一个数) < 1e-7 .abs是取绝对值,即判断两个数只差任意小则我们认为这两个数相等,1e-7表示10的-7次方,式子右边可以取更小的值
pow() 方法返回 xy(x 的 y 次方) 的值。
pow(3,0.5)的指为1.7320508075688772,因为程序中浮点数有限位数的,只能保存到这
1.7320508075688772乘以1.7320508075688772得到的是2.9999999999999996
所有不等于3
简单来说,就是计算机对小数的处理精度不足,平常不会有啥问题,但是遇到一些特殊的小数的加减乘除的时候,就会出现处理精度不足的问题,
就好像0.1+0.2==0.3 也是false一样,所以在涉及到有小数参与的数学运算的时候,最好是找一个封装好的运算库,可以避免这些问题
浮点数比较不能用==
类似 3 这种开根号无法除尽的,算出来的结果,其实是默认精确了位数的,不管你设置多少位,总会有丢失。所以你两个再乘回来,就会小那么一点点,系统就会按默认的精确位数,结果就是2.99999999.。。这种的,所以 一 首先,结果是浮点数,即便能开根号算整数,也是浮点数,所以你不但要精确一下小数位数,右边还要带上小数点的0
在计算的时候会先计算pow(3,0.5)的值,计算的结果是浮点数,存在误差,两个数再乘一起,结果是不等于3的,所以最终会输出false
浮点数不能直接用==
判断相等,可以进行两数相减的绝对值小于一个极小值来判断,如
print(abs(0.1 + 0.2 - 0.3) < 1e-10)
因为pow(3, 0.5)算出来是0.73多,相乘之后就算计算机算得小数位数再多也不等于三,而是2.999999…
这是计算机计算存在的误差,虽然小但很多时候会导致BUG出现。
print(pow(3, 0.5))
>>> 1.7320508075688772935274463415058723669428
print(pow(3, 0.5) * pow(3, 0.5))
>>> 2.9999999999999999999999999999999999999999
print(pow(3, 0.5) * pow(3, 0.5) == 3)
print(pow(3, 0.5) * pow(3, 0.5))
结果:
False
2.9999999999999996
在计算的时候会先计算pow(3,0.5)的值,计算的结果是浮点数,存在误差,两个数再乘一起,结果是不等于3的,所以最终会输出false
数据类型不同,pow方法得出的结果是浮点数,浮点数乘浮点数结果为浮点数,而3是整型,浮点数不等于整型
你在将浮点数与整数做比较,浮点数有误差是不会等于整数的