我在使用小数位数时遇到了一些问题。
我目前正在制定一些公式,这些公式需要使用圆(非Pi)作为因子;或比率决定因素。
在使用这种类型的数据时,我经常使用重复的无限数。有没有一种方法可以说服Python那样对待它们,而无需通过十进制模块自己定义每个值?
在计算行星和原子轨道时需要精确表示。有成千上万种可能性,所以我不能真正使用陷阱或天花板。
For example, I often see rounding errors even with Cdecimal like this one:
initial_input_over_n
5.500000000000000000000000000000000000000000000000000000000000001
initial_input_over_np
53.50000000000000000000000000000000000000000000000000000000000001"
当您开始将它们相乘并除时,情况变得更加复杂。整个比例应该是1,因为它是两个无穷大的数字(圆)相除,但是由于舍入的选择,我得出一个off数字。
避免这种情况的发生非常重要。必须从系统中删除熵。
这是必要的,因为我需要将这些数字减少到一个特定的数字,以添加到系统的其余部分,而无需使用任何强制数字。
到目前为止,我已经尝试了十进制类型,但无法弄清楚正确的代码是什么使这些数字保持其预期的状态。我使用了许多不同的输入,因此需要灵活的输入才能进入亿万种。
import decimal
from decimal import *
getcontext().prec = 64
input("Press Enter To Continue ...\n\n\n"
"# Input = Total number of points\n"
"# N = Number of points traveled\n"
"# NP = Number of points remaining\n\n")
IN = decimal.Decimal (input("Enter Input: "))
N = decimal.Decimal (input("Enter N: "))
NP = decimal.Decimal (input("Enter NP: "))
IN = 0.5 if IN == 0 else IN
N = 0.5 if N == 0 else N
NP = 0.5 if NP == 0 else NP
_input = IN
n = N
np = NP
# - Used to allow lowercase letters in code. Ensures no division by zero
errors occur.
# input = total number of points
# n = number of points traveled
# np = number of points remaining
# ----------------- #
# Read Ratios #
# ----------------- #
initial_sine_base = _input + n + np
initial_sine_input = initial_sine_base / _input
initial_sine_n = initial_sine_base / n
initial_sine_np = initial_sine_base / np
initial_sine_ratio = initial_sine_input + initial_sine_n +
initial_sine_np
initial_sine_over_base = initial_sine_ratio / initial_sine_base
initial_input_over_base = _input / initial_sine_ratio
initial_n_over_base = n / initial_sine_ratio
initial_np_over_base = np / initial_sine_ratio
initial_input_over_n = _input / initial_sine_n
initial_input_over_np = _input / initial_sine_np
initial_input_over_nnp = _input / (initial_sine_n + initial_sine_np)
initial_n_over_input = n / initial_sine_input
initial_n_over_np = n / initial_sine_np
initial_n_over_inputnp = n / (initial_sine_input + initial_sine_np)
initial_np_over_input = np / initial_sine_input
initial_np_over_n = np / initial_sine_n
initial_np_over_inputnp = np / (initial_sine_input + initial_sine_n)
#Subdivides
check = (n * _input * np)
unknown = (n * _input * np) / initial_sine_base
#Circle Ratios
plus_one = (_input + _input + n + n + np) / n
minus_one = (_input + _input + n + np) / n
sub_divide_half = 2
另一个例子是两个类似的圆的相乘或相除;
plus_one = (_input + _input + n + n + np) / n
minus_one = (_input + _input + n + np) / n
#Circle Ratios
plus_one 33.18181818181818181818181818181818181818181818181818181818181818
minus_one 32.18181818181818181818181818181818181818181818181818181818181818
一旦我开始将它们分开或使用任何运算符,它们就会瓦解,但总的来说,它们之间只有1个整数。
目标是保持比率完全稳定,因此我可以仅通过输入将等于2的一半细分。我只需要获取它,以便Python计算适当的比率,直到精确的小数。通过这种方式,当我进一步处理并输入一些更复杂的计算时,一切都会变得混乱。
这只能通过除法或乘法来完成,因此快捷方式不存在。
The inputs I used for reference were input = 118, n = 11, np = 107
答案 0 :(得分:0)
例如,即使使用Cdecimal,我也经常看到舍入错误 一:initial_input_over_n 5.500000000000000000000000000000000000000000000000000000000000000000000000000000001
这可能在两种情况下发生:
decimal.Decimal(2.5)
)进行了操作。实数是不精确的,可能会将您的小数位数设置为您不期望的值。主要示例:decimal.Decimal(1/3)
将关闭。顺便说一句:以下代码将导致问题:
IN = 0.5 if IN == 0 else IN
如果将IN输入为零,则将IN设置为浮点数。会使分裂失败。
>>> b = d.Decimal('123')
>>> IN = 0.5
>>> b / IN
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'decimal.Decimal' and 'float'