十进制类型(复杂圆圈)的十进制存在一些严重问题

时间:2019-01-07 11:47:18

标签: python anaconda

我在使用小数位数时遇到了一些问题。

  1. 我目前正在制定一些公式,这些公式需要使用圆(非Pi)作为因子;或比率决定因素。

  2. 在使用这种类型的数据时,我经常使用重复的无限数。有没有一种方法可以说服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

1 个答案:

答案 0 :(得分:0)

  

例如,即使使用Cdecimal,我也经常看到舍入错误   一:initial_input_over_n   5.500000000000000000000000000000000000000000000000000000000000000000000000000000001

这可能在两种情况下发生:

  1. 您已使用实数(即通过从整数或实数设置十进制创建的十进制; decimal.Decimal(2.5))进行了操作。实数是不精确的,可能会将您的小数位数设置为您不期望的值。主要示例:decimal.Decimal(1/3)将关闭。
  2. 更有可能:您尚未将舍入设置为您期望的方式;十进制模块支持8种舍入方式。有关可用值,请参见the docs

顺便说一句:以下代码将导致问题:

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'