浮点除以零 Python

float division by zero Python

我正在尝试将一个数字除以另一个很小的数字。 "q" 始终是一个介于 0 和 1 之间的浮点数,当 n 超过 1000 时,输出显示 "float division by zero" 因为它将小数字四舍五入为零。我已经尝试使用 Decimal 但仍然无法正常工作

#Librerías
import numpy as np
import matplotlib.pyplot as plt
from decimal import Decimal

#Datos
p = float(input("Introduzca probabilidad de error de bit: "))
while p < 0 or p > 1:
    p = float(input("Introduzca probabilidad de error de bit: "))
n = int(input("Introduzca número de bits: "))
while n < 0:
    n = int(input("Introduzca número de bits: "))

#Cálculos
q = 1-p
pexito = (q**n)
intentos = 1/pexito
print()
print("El número medio de intentos es:",intentos)
print()
print("La probabilidad de transmitir correctamente",n,"bits es:",pexito)



ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-10-606e023fc7ec> in <module>
     15 q = 1-p
     16 pexito = (q**n)
---> 17 intentos = 1/pexito
     18 print()
     19 print("El número medio de intentos es:",intentos)

ZeroDivisionError: float division by zero

因为n是一个整数。所以

q = 1-p
pexito = (q**n)

pexito = (q**n)也是一个整数。这就是为什么会出现被零除异常的原因。如果你想让 intentos = 1/pexito 成为一个浮点除法那么就把它写成:

intentos = 1/float(pexito)

但请记住 float64 位,而 decimal128 位。 如果 n 是一个大数,则使用 doubledecimal 而不是浮点数。 它将解决被零除的问题。

更新:

正确代码如下:

#Librerías
import numpy as np
import matplotlib.pyplot as plt
from decimal import Decimal

#Datos
p = float(input("Introduzca probabilidad de error de bit: "))
while p < 0 or p > 1:
    p = float(input("Introduzca probabilidad de error de bit: "))
n = int(input("Introduzca número de bits: "))
while n < 0:
    n = int(input("Introduzca número de bits: "))

#Cálculos
q = 1-p
pexito = (q**n)
intentos = 1/float(pexito)
print()
print("El número medio de intentos es:",intentos)
print()
print("La probabilidad de transmitir correctamente",n,"bits es:",pexito)

只需检查它的值 0.5 和 5。它工作正常!但是对于大数字,你必须计算它需要的位数并相应地使用关键字。谢谢

尝试增加 your precision:

from decimal import Decimal, getcontext

getcontext().prec = 2*n

a = Decimal(a)
b = Decimal(b)
c = a/b

尝试在第 17 行将 pexito 转换为浮点数

    intentos = 1/float(pexito)

您可以使用标准库中的 Fraction class 对分数进行精确算术:

>>> from fractions import Fraction
>>> n = 2000
>>> p = Fraction(1, 2)
>>> result = p ** n
>>> 1 / result
Fraction(114813069527425452423283320117768198402231770208869520047764273682576626139237031385665948631650626991844596463898746277344711896086305533142593135616665318539129989145312280000688779148240044871428926990063486244781615463646388363947317026040466353970904996558162398808944629605623311649536164221970332681344168908984458505602379484807914058900934776500429002716706625830522008132236281291761267883317206598995396418127021779858404042159853183251540889433902091920554957783589672039160081957216630582755380425583726015528348786419432054508915275783882625175435528800822842770817965453762184851149029376, 1)

Fraction 构造函数也接受像 '0.5' 这样的十进制格式的字符串或像 '1/2' 这样的精确分数,所以你可以用 p = Fraction(input(...)) 而不是 [=16] =].

请注意,如果结果 实际上 为零(当 p 本身为零时会发生这种情况),这仍然会给您一个 ZeroDivisionError