我正在尝试将数字除以很小的数字。 “ q”始终是介于0到1之间的浮点数,并且当n超过1000时,输出将显示“浮点数除以零”,因为它将小数舍入为零。我已经尝试了十进制,但仍然无法正常工作
#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
尝试增加your precision:
from decimal import Decimal, getcontext
getcontext().prec = 2*n
a = Decimal(a)
b = Decimal(b)
c = a/b
您可以使用标准库中的Fraction
类对分数进行精确算术:
Fraction
>>> 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(...))
。
请注意,如果结果为[[actually零(当float(input(...))
本身为零时会发生这种情况),这仍然会为您提供ZeroDivisionError
。
p
intentos = 1/float(pexito)
是整数。所以n
q = 1-p pexito = (q**n)
也是整数。这就是为什么会产生零除异常的原因。如果要将pexito = (q**n)
设为浮点除法,则只需将其写为:
intentos = 1/pexito
但是请记住,intentos = 1/float(pexito)
为float
位,32
为double
位,64
为1decimal
位。如果
28
大,则使用n
或double
代替浮点数。它将解决被零除的问题。已更新:
这里是正确的代码:
decimal
只需检查它的值0.5和5。它是完美的!但是对于较大的数字,您必须计算其所需的位数,并相应地使用关键字。谢谢