浮点除以零 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)
但请记住 float
是 64
位,而 decimal
是 128
位。 如果 n
是一个大数,则使用 double
或 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/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
。
我正在尝试将一个数字除以另一个很小的数字。 "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)
但请记住 float
是 64
位,而 decimal
是 128
位。 如果 n
是一个大数,则使用 double
或 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/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
。