代码之家  ›  专栏  ›  技术社区  ›  Majoris

小数中的平方根不准确

  •  0
  • Majoris  · 技术社区  · 6 年前

    为什么小数点显示的平方根不准确?它必须完全为零。

    print('Enter your input:')
    n = input()
    
    def squareroot(n):
            i = 0.01
            while i*i < float(n):
                    i += 0.01
            return i
    
    print (squareroot(n))
    

    输出-

    Enter your input:
    100
    10.009999999999831
    
    Enter your input:
    25
    5.009999999999938
    
    Enter your input:
    9
    3.00999999999998
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   wrvb    6 年前

    你的算法相当于“不断增加” i 0.01,直到 i*i n “.如果 x 是真正的平方根,这将返回一个介于 十、 x+.01 ,这正是你所看到的。如果你想要一个更准确的答案,选择一个较小的增量或者(更好的)使用一个更好的算法,比如 binary search Newton's method .或者,如果这不是家庭作业,就使用 math.sqrt .

        2
  •  1
  •   blhsing    6 年前

    这是因为二进制浮点数的值在不是2的幂时是近似的。

    0.1 在标准中表示 binary64 格式实际上就是 0.1000000000000000055511151231257827021181583404541015625 十进制。看见 Is floating point math broken? 详细解释。

    为了避免二进制浮点数的继承不准确,可以使用 decimal 模块,或者在您的情况下,只需增加 i 用一个2的幂来代替,比如 0.0078125 ,也就是 2 ** -7 .

    def squareroot(n):
        i = 0.0078125
        while i * i < float(n):
            i += 0.0078125
        return i
    

    更改后的输入/输出示例:

    Enter your input:
    25
    5.0