zoukankan      html  css  js  c++  java
  • 对pow函数的思考

    今天在学习Python时,用pow函数时,意外发现pow(1000,1/3)的结果居然不是10,而是9.999999999999998。

    print(pow(1000, 1/3))
    

    输出结果:

    9.999999999999998
    

    后面了解到,pow()是通过内置的方法直接调用,内置方法会把参数作为整型,而math模块则会把参数转换为float。
    那么会不会是float化的时候出了问题呢。
    我们试着将1/3转化为浮点型:

    print(float(1/3))
    

    输出结果:

    0.3333333333333333
    

    我们发现这里只有16位小数,与是我试着继续扩大他的小数点位数:

    a = 1/3
    print('%.20f' % a)
    

    输出结果:

    0.33333333333333331483
    

    然后我们可以发现他的值永远不可能是将1平均分成3分,就像是数学里的问题:0.9999999999999999999……=1一样,总会有误差在里面。
    我们将得到的数字进行运算。

    print(1000**0.3333333333333333)
    

    输出结果:

    9.999999999999998
    

    成功破案!这就是为什么pow(1000,1/3)的结果不是10的原因。
    那怎么解决呢?
    当我们使用pow函数时,最后结果可以用math.ceil()(向上取整)来解决输出结果不准确的问题。

    import math
    a = pow(1000, 1/3)
    print(math.ceil(a))
    

    输出结果:

    10
    

    当然我们这里讨论的只是跟为整数时的求根问题,如果跟不是整数时不需要用math.ceil()函数,因使用pow()函数其结果误差极小,可以忽略不计,直接使用。

  • 相关阅读:
    Luogu P1131 时态同步
    Codeforces Round #507 B. Shashlik Cooking
    Codeforces Round #507 A. Palindrome Dance
    Luogu P3818 小A和uim之dark♂逃离 Ⅱ
    Luogu P1373 小a和uim之dark♂逃离 Ⅰ
    Luogu P4822 [BJWC2012]冻结
    Luogu P2575 高手过招(博弈论)
    Luogu P1074靶形数独
    Luogu P2323「皇后游戏」
    GodFly的寻宝之旅·状压DP
  • 原文地址:https://www.cnblogs.com/zj666666/p/12419627.html
Copyright © 2011-2022 走看看