【问题标题】:ZeroDivisionError: float division by zero?ZeroDivisionError:浮点除以零?
【发布时间】:2019-11-20 05:55:31
【问题描述】:
def fx(x):
    v = float(x*x*x - 5*x - 7)
    return v


err = int(input("Enter zeroes in approxiamtion in solution: "))
b = float(input("Enter upper limit for root: "))
a = float(input("Enter lower limit for root: "))
c = 0.0
while fx(c) > (1 * 10 ** -err):
    c = b - ((b - a)/(fx(b) - fx(a))) * fx(b)
    print(a, b, c, sep=', ')
    a = b
    b = c
    # c = 0
    print()
print("The root is approximately = ", b)

为什么我在执行此代码时得到一个零除错误,即使循环给出了正确的值,尽管有错误?

编辑:我将 ^ 运算符更改为 ** 并删除了 c = 0 但现在答案甚至与实际答案都不接近。 ^ 操作员奇怪地给了我正确的答案。

带有**运算符的输出:

Enter zeroes in approxiamtion in solution: 3
Enter upper limit for root: 2
Enter lower limit for root: 1
The root is approximately =  2.0

使用 ^ 运算符输出:

Enter zeroes in approxiamtion in solution: 3
Enter upper limit for root: 2
Enter lower limit for root: 1
1.0, 2.0, 6.5
Traceback (most recent call last):

2.0, 6.5, 2.1658986175115205
  File "C:/Users/anves/PycharmProjects/nt/nt.py", line 46, in <module>

    c = b - (((b - a)/(fx(b) - fx(a))) * fx(b))
6.5, 2.1658986175115205, 2.302797651275858

ZeroDivisionError: float division by zero
2.1658986175115205, 2.302797651275858, 2.934211734811194

2.302797651275858, 2.934211734811194, 2.705017710718186

2.934211734811194, 2.705017710718186, 2.7438299655247143

2.705017710718186, 2.7438299655247143, 2.7474171932954787

2.7438299655247143, 2.7474171932954787, 2.7473464241055843

2.7474171932954787, 2.7473464241055843, 2.7473465403033757

2.7473464241055843, 2.7473465403033757, 2.747346540307211

2.7473465403033757, 2.747346540307211, 2.747346540307211

最后一个值是没有被打印出来的正确值?

【问题讨论】:

  • Python 中的幂运算符是**,而不是^
  • 蒂埃里是对的。 ^ 运算符是按位异或运算:docs.python.org/3.4/library/…
  • @ThierryLathuille 如果我使用 ** 运算符,我根本得不到答案
  • 您在 for 循环结束时将 c 设置为 0。这意味着您的 while 语句正在检查 fx(0) &gt; error_bound 是否每次。一次为真,终生为真。
  • 你应该测试abs(fx(c)) &gt; (1 * 10 ** (-err))

标签: python python-3.x pycharm


【解决方案1】:

当我添加使用 abs()** 的建议然后捕获异常时,我得到如下代码:

def fx(x):
    v = float(x*x*x - 5*x - 7)
    return v


err = int(input("Enter zeroes in approxiamtion in solution: "))
b = float(input("Enter upper limit for root: "))
a = float(input("Enter lower limit for root: "))
c = 0.0

while abs(fx(c)) > ( 10 ** -err):
    try:
        c = b - ((b - a)/(fx(b) - fx(a))) * fx(b)
    except ZeroDivisionError:
        break
    print(a, b, c, sep=', ')
    a = b
    b = c
    c = 0
    print()
print("The root is approximately = ", b)

当我运行它时,我得到了这个:

Enter zeroes in approxiamtion in solution: 3
Enter upper limit for root: 2
Enter lower limit for root: 1
1.0, 2.0, 6.5

2.0, 6.5, 2.1658986175115205

6.5, 2.1658986175115205, 2.302797651275858

( steps omitted )

2.7473464241055843, 2.7473465403033757, 2.747346540307211

2.7473465403033757, 2.747346540307211, 2.747346540307211

The root is approximately =  2.747346540307211

这会产生正确的答案吗?

您可以从输出的倒数第二行看到最后两个数字相同(b 和 c),下一次循环 a 和 b 将具有这些值,因此 fx(b) - fx(a) 将导致 0.0 和ZeroDivisionError。

【讨论】:

    【解决方案2】:

    我刚刚运行了您的代码,发现fx(b)fx(a) 是相同的值。因此,当您计算 fx(b) 减去 fx(a) 时,您会得到 0 希望这会有所帮助。

    Terminal -----------------------------------
    Enter zeroes in approxiamtion in solution: 5
    Enter upper limit for root: 5
    Enter lower limit for root: 5
    93.0
    93.0
    Traceback (most recent call last):
      File "d:/PythonScripts/first_python_project/curso_python.py", line 13, in <module>
        c = b - ((b - a)/(fx(b) - fx(a))) * fx(b)
    ZeroDivisionError: float division by zero
    

    添加更多: 当您达到较低的值时,只有 fx(b)fx(a) 变得非常相似。 像这样的:

    Enter zeroes in approxiamtion in solution: 3
    Enter upper limit for root: 5
    Enter lower limit for root: 3
    93.0
    5.0
    3.0, 5.0, 2.8863636363636362
    
    2.614751596543952
    93.0
    5.0, 2.8863636363636362, 2.825218326106125
    
    1.424401534793665
    2.614751596543952
    2.8863636363636362, 2.825218326106125, 2.7520503761266304
    
    0.08317571970829363
    1.424401534793665
    2.825218326106125, 2.7520503761266304, 2.747512887487003
    
    0.002935214303143141
    0.08317571970829363
    2.7520503761266304, 2.747512887487003, 2.747346905212986
    
    6.43830337132556e-06
    0.002935214303143141
    2.747512887487003, 2.747346905212986, 2.747346540335565
    
    5.002736003234531e-10
    6.43830337132556e-06
    2.747346905212986, 2.747346540335565, 2.747346540307211
    
    1.7763568394002505e-15
    5.002736003234531e-10
    2.747346540335565, 2.747346540307211, 2.747346540307211
    
    1.7763568394002505e-15
    1.7763568394002505e-15
    Traceback (most recent call last):
      File "d:/PythonScripts/first_python_project/curso_python.py", line 13, in <module>
        c = b - ((b - a)/(fx(b) - fx(a))) * fx(b)
    ZeroDivisionError: float division by zero
    

    【讨论】:

    • 那么你把上限和下限设置成一样了,当然你会得到一个除零错误。
    • 上限应大于下限
    • "and found that fx(b) and fx(a) are the same value" ab输入了相同的值,当然fx(b) - fx(a)会是0
    • @SyntaxVoid 是的,这段代码没有考虑到的小事。
    • @TomásPrudente 我没有编写详细的代码,这只是我为检查公式而编写的测试代码
    【解决方案3】:

    您收到此错误是因为在您的代码中的某个时刻

    让我们说fx(a)=1.0000000000000001fy(b)=1.0

    你得到的是 0.0 而不是 fx(a)-fy(b)=0.0000000000000001

    因此会出现零除错误

    【讨论】:

    • 你有什么解决方案来解决这个问题
    • 我建议你增加精度点或添加尝试和除外条件来解决这个问题
    • 那不应该是你的答案吗?
    • @SyntaxVoid op 询问为什么,我告诉他为什么,在评论中他问如何解决我的回答
    【解决方案4】:

    我看到了两个问题。 一种是表达式(1 * 10 ^ -err)。 Python 中的运算符 ^ 表示按位异或,10 ^ -err 是负整数。因此,在找到根之后,您的循环不会结束。 它应该是 (10 ** -err)。您还必须将 abs(f(c)) 与它进行比较。

    第二个问题是 c = 0 作为根的初始值。它应该在 (a, b) 区间内,而不是零。

    【讨论】:

      【解决方案5】:

      你需要重新设计你的逻辑,但我可以告诉你(1 * 10 ** -err) 并没有按照你的想法去做。 ^ 是按位异或运算符。对于指数,您需要**。所以你的代码应该是

      (1 * 10 ** -err)
      

      我尝试运行它,它立即停止,因为 fx(0) 是一个负数,它小于上面括号中生成的非常小的正值。

      这是一个工作版本,虽然我不确定代码实际完成了什么......

      def fx(x):
          v = float(x*x*x - 5*x - 7)
          return v
      
      
      err = int(input("Enter zeroes in approximation in solution: "))
      b = float(input("Enter upper limit for root: "))
      a = float(input("Enter lower limit for root: "))
      c = 0.0
      ctr = 0 #                           ^^^^^^^^^^^^^^^^^^
      while abs(fx(c)) > (1 * 10 ** -err) and fx(b) != fx(a): # ^ is binary xor!
          ctr += 1
          c = b - ((b - a)/(fx(b) - fx(a))) * fx(b)
          print(ctr, a, b, c, sep=', ')
          a = b
          b = c
          c = 0
          print()
      print("The root is approximately = ", b, ' after ', ctr, ' iterations')
      input()
      

      我尝试运行 3 次,范围为 1 到 10 和 1/3/8 个零。所有三次的结果都以 b 完全相同。只是需要不同数量的迭代才能到达那里。

      【讨论】:

        猜你喜欢
        • 2018-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多