TypeError: both arguments should be Rational instances when trying to use fractions
TypeError: both arguments should be Rational instances when trying to use fractions
所以我正在尝试编写一个代码来解决微积分中的一般解决方案,我的一个值是 f1 = fractions.Fraction(2.0, period)
的分数,但是如果我使用 12.5 作为期间它返回错误。
代码:
from cmath import sin
import math
import re
import operator
import fractions
from decimal import Decimal
amplitude = input("What is the A value?: ")
period = input("What is the P value?: ")
ogperiod = float(period)
period = float(period)
f1 = fractions.Fraction(2.0, period)
print(f1)
但我得到的只是类型错误:两个参数都应该是 Rational 实例
完整错误代码:
TypeError Traceback (most recent call last)
Input In [84], in <cell line: 27>()
23 ogperiod = float(period)
24 period = float(period)
---> 27 f1 = fractions.Fraction(2.0, period)
28 print(f1)
31 bpi = 2 * math.pi
File /opt/homebrew/Cellar/python@3.9/3.9.8/Frameworks/Python.framework/Versions/3.9/lib/python3.9/fractions.py:152, in Fraction.__new__(cls, numerator, denominator, _normalize)
147 numerator, denominator = (
148 numerator.numerator * denominator.denominator,
149 denominator.numerator * numerator.denominator
150 )
151 else:
--> 152 raise TypeError("both arguments should be "
153 "Rational instances")
155 if denominator == 0:
156 raise ZeroDivisionError('Fraction(%s, 0)' % numerator)
TypeError: both arguments should be Rational instances
回溯告诉你问题到底是什么:Fraction
实例的分子和分母都需要是有理数——即表示为两个整数之比的数。由于在硬件中实现的方式,浮点数本身并不合理。有关详细信息,请参阅 Is floating point math broken?。
基本上,fractions.Fraction
实例的分子和分母本身需要是 int
或 Fraction
。
我发现一个问题是将float
分配给period
。 Fraction
class 有一个构造函数,它接受 Rational
class 的两个值(分子和分母)(参见 documentation)。自 Python 版本 3.2 以来,可以从 float
初始化 Fraction
但仅使用一个参数。
因此,如果您想保留 2 个值(2.0 和 period
),则必须将 2.0 更改为 2 并将 period
用作 int
(失去精度)。因此,您的代码将是:
f1 = fractions.Fraction(2, int(period))
编辑:
如果想保持period
的精度,最好将其转化为分数,然后做小数除法初始化f1
。即:
period = fractions.Fraction(period)
f1 = fractions.Fraction(2 * period.denominator, period.nominator)
所以我正在尝试编写一个代码来解决微积分中的一般解决方案,我的一个值是 f1 = fractions.Fraction(2.0, period)
的分数,但是如果我使用 12.5 作为期间它返回错误。
代码:
from cmath import sin
import math
import re
import operator
import fractions
from decimal import Decimal
amplitude = input("What is the A value?: ")
period = input("What is the P value?: ")
ogperiod = float(period)
period = float(period)
f1 = fractions.Fraction(2.0, period)
print(f1)
但我得到的只是类型错误:两个参数都应该是 Rational 实例 完整错误代码:
TypeError Traceback (most recent call last)
Input In [84], in <cell line: 27>()
23 ogperiod = float(period)
24 period = float(period)
---> 27 f1 = fractions.Fraction(2.0, period)
28 print(f1)
31 bpi = 2 * math.pi
File /opt/homebrew/Cellar/python@3.9/3.9.8/Frameworks/Python.framework/Versions/3.9/lib/python3.9/fractions.py:152, in Fraction.__new__(cls, numerator, denominator, _normalize)
147 numerator, denominator = (
148 numerator.numerator * denominator.denominator,
149 denominator.numerator * numerator.denominator
150 )
151 else:
--> 152 raise TypeError("both arguments should be "
153 "Rational instances")
155 if denominator == 0:
156 raise ZeroDivisionError('Fraction(%s, 0)' % numerator)
TypeError: both arguments should be Rational instances
回溯告诉你问题到底是什么:Fraction
实例的分子和分母都需要是有理数——即表示为两个整数之比的数。由于在硬件中实现的方式,浮点数本身并不合理。有关详细信息,请参阅 Is floating point math broken?。
基本上,fractions.Fraction
实例的分子和分母本身需要是 int
或 Fraction
。
我发现一个问题是将float
分配给period
。 Fraction
class 有一个构造函数,它接受 Rational
class 的两个值(分子和分母)(参见 documentation)。自 Python 版本 3.2 以来,可以从 float
初始化 Fraction
但仅使用一个参数。
因此,如果您想保留 2 个值(2.0 和 period
),则必须将 2.0 更改为 2 并将 period
用作 int
(失去精度)。因此,您的代码将是:
f1 = fractions.Fraction(2, int(period))
编辑:
如果想保持period
的精度,最好将其转化为分数,然后做小数除法初始化f1
。即:
period = fractions.Fraction(period)
f1 = fractions.Fraction(2 * period.denominator, period.nominator)