浮点除以零的Python

问题描述 投票:1回答:4

我正在尝试将数字除以很小的数字。 “ 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
python decimal division
4个回答
1
投票

尝试增加your precision

from decimal import Decimal, getcontext

getcontext().prec = 2*n

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

1
投票

您可以使用标准库中的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


-2
投票
尝试在第17行上将pexito转换为浮点数

p


-2
投票
因为 intentos = 1/float(pexito) 是整数。所以

n

q = 1-p
pexito = (q**n)
也是整数。这就是为什么会产生零除异常的原因。如果要将pexito = (q**n)设为浮点除法,则只需将其写为:

intentos = 1/pexito

但是请记住,intentos = 1/float(pexito)
float位,32double位,64为1 decimal位。 

如果28大,则使用ndouble代替浮点数。它将解决被零除的问题。

已更新:

这里是正确的代码:

decimal

只需检查它的值0.5和5。它是完美的!但是对于较大的数字,您必须计算其所需的位数,并相应地使用关键字。谢谢
© www.soinside.com 2019 - 2024. All rights reserved.