python利用math.pow(),pow() 和 **进行指数运算的问题

您所在的位置:网站首页 对数的底数可以是负数吗 python利用math.pow(),pow() 和 **进行指数运算的问题

python利用math.pow(),pow() 和 **进行指数运算的问题

2023-06-26 03:41| 来源: 网络整理| 查看: 265

python利用math.pow, pow和 ** 进行指数运算的问题 1、问题说明2、接下来对math.pow(),pow() 和 ** 进行简单介绍3、进行实验- 发现(1)- 发现(2)- 发现(3)- 发现(4)4、 进一步的实验

1、问题说明

在刷力扣的时候碰到这样两道题,剑指Offer14-1和剑指Offer14-2,发现解题方法思路相同,但是用不用的办法算最后的结果,值竟然不一样,于是开始寻找问题。具体代码和结果如下:

class Solution: def cuttingRope(self, n: int) -> int: if n >>a - c 0.0 >>>a - b 0.0 >>>a - d 0.0 >>>a == b True >>>a == c False >>>a == d True >>>b == c False

变量值: 在这里插入图片描述

- 发现(1)

通过这四种方式算得的值,仅有第三种是int形式,同时做差发现都为0.0,这个时候我们以为他们是相等的。

- 发现(2)

发现虽然我们做差都是等于0.0.看似相等,但是真正用==判断的时候,却不相等。

- 发现(3)

虽然发现(1)看似相等,但是这个时候我们将a or b or d 三个float类型的数据进行int转换,这个时候再去减就存在较大差值了。而我们将c转为float,再去最差和==,都是没问题的。这个时候我们怀疑是int的时候,存在数据损失,而float则没什么问题。

>>>int(a) - c -33 >>>int(a) == c False >>>a - float(c) 0.0 >>>a == float(c) True - 发现(4)

这时候回到那两道力扣题,offer 14-1解题如下,他是遵循math.pow()的结果: 在这里插入图片描述 Offer14-2解题如下,它遵循**运算: 在这里插入图片描述 小结,两种方法在遇见比较大的数的时候,其实是有问题的,但是这两道题却遵循不同的方法,这让我十分困惑,并且没有找到解决方案。

4、 进一步的实验

我们想确定,math.pow()和 ** 运算哪个不准,所以我们就行了如下实验:

import math for i in range(10,100): print(i) # 查看i是int型时,最后的值 print('int num: %d' % 3 ** i) # 查看i是float型时,最后的值 print('flo num: %20.2f' % math.pow(3, float(i))) print(math.pow(3, float(i)) == 3 ** i) print('---------------') 输出: 33 int num: 5559060566555523 flo num: 5559060566555523.00 True --------------- 34 int num: 16677181699666569 flo num: 16677181699666568.00 False ---------------

上述实验发现,在i=34的时候,两种方法算的值不再相同了。 认真观测可以发现,在i=33的时候,两个值相等,证明都没有问题,但是再乘3,就不对了吗,重点是i==33时,int型的值乘3是等于i=34时的数值的,说明i=34的时候,int型(通过* *计算)的值是没问题的,而而是浮点数值出错。 以上,其实我并没有弄清楚为什么,但是希望大家能都知道这个问题的存在,欢迎大家交流指正。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3