我的问题可以用Python完成吗?是这样吗?

问题描述 投票:-2回答:1

我需要能够准确输入两个部分已知的因子,每个因子精确地在小数点后15位,产品答案精确地在29个小数点后。在程序运行期间,这两个因素的开头数字(0.199848 ...和4.97438 ...)必须保持不变。每个因素中的零都是Python必须使用的并且“数值变化”。当乘以因子时,此“数值变化”必须将乘积‭0.99412293432154732337566954206转换为29位小数,并且不少于29位以匹配我的产品输入。我想知道Python完成运行后最终的因素以及与之匹配的产品。

示例:

我的输入因子1 0.199848000000000‭因子2 4.974380000000000产品‭0.99412293432154732337566954206

输出:输出希望是什么0.199848442087413 X 4.974384208042620 =‭0.99412293432154732337566954206

因此,总之,Python会找出与我给它的已知产品‭0.99412293432154732732566954206的输入相匹配的因素。我认为Python可能会在零上使用组合/排列,直到找到产生我输入的乘积的组合为止。

python
1个回答
0
投票
...]的开头数字(0.199848 ...和4.97438 ...)

一些指针;

  • 您不能使用浮点数。那些仅具有约17个十进制数字的精度,并且从十进制到二进制浮点的转换本质上是不精确的。
  • decimal模块是一个不错的起点。

例如:

In [1]: import decimal as dm

In [2]: dm.getcontext().prec = 29

In [3]: factor1 = dm.Decimal('0.199848')
Out[3]: Decimal('0.199848')

In [4]: factor2 = dm.Decimal('4.97438')
Out[4]: Decimal('4.97438')

In [5]: desired = dm.Decimal('0.99412293432154732337566954206')
Out[5]: Decimal('0.99412293432154732337566954206')

In [6]: factor1*factor2 > desired
Out[6]: False
  • 正如Błotosmętek在评论中指出的那样,组合的数量太大,无法进行暴力搜索。因此,您必须采用另一种方式。

请记住,产品可以是;

  • 小于所需结果,
  • 等于所需结果或
  • 大于所需的结果。

在第一种情况下,其中一个因素必须变得更大。在最后一种情况下,其中一个因素必须变小。

由于第二个因素最大,所以我将从factor1开始。在小数点后加上9(可能的最大增量),并检查乘积是否大于目标值。

In [7]: new1 = dm.Decimal('0.1998489')
Out[7]: Decimal('0.1998489')

In [8]: new1*factor2 > desired
Out[8]: True

所以这个数字太大。小于9/2的最大整数是4,因此请尝试这样做。

In [9]: new1 = dm.Decimal('0.1998484')
Out[9]: Decimal('0.1998484')

In [10]: new1*factor2 > desired
Out[10]: False

现在将0.1998489和0.1998484之间的距离减半。并再次检查。你会发现0.1998487太大,但0.1998486太大。

现在转到factor1的下一位,依此类推,直到找到factor1的正确位数。

然后对factor2进行相同操作,但现在也测试是否相等。

© www.soinside.com 2019 - 2024. All rights reserved.