将两个整数(一大一小)相除时得到错误答案
Posted
技术标签:
【中文标题】将两个整数(一大一小)相除时得到错误答案【英文标题】:Getting the wrong answer when dividing two integers, one large and one small 【发布时间】:2017-08-20 16:14:07 【问题描述】:我正在尝试使用质数筛来查找某些数字的所有质因数。在我的代码中,我最终不得不将一个非常大的数字除以一个小数字,以找到一个超出我正在使用的筛子范围的素数。这应该不是问题,事实上,该方法对我检查的每个数字都非常有效,除了一个。
我遇到的问题是,我将这个大数除以 51 以找到素因数,然后当我将它乘以 51 以检查它是否等于原始数字...它不!
无论我将其转换为 int 还是将其保留为科学记数法中的浮点数,它都不起作用。
我知道浮点数并不完美,但我不知道如何解决这个奇怪的错误。我什至将这些数字插入计算器并得到了正确的答案,但我的代码给了我错误的答案。
这里发生了什么? 如果你运行我的代码,你会看到检查返回 False,而它们应该是 True。
正如我之前所说,这种方法适用于我正在测试的一个数字,它的因素超出了我正在使用的筛子的范围,我遇到的问题只是这个特定的大数字。
正确答案应该是 1,176,462,117,668,023,508,828,242,241 我得到的答案是 1,176,462,117,668,023,481,334,235,136
l_number = 59999568001069198950240354291
answer = 59999568001069198950240354291 / 51
int_answer = int(answer)
check = int_answer*51
check2 = answer * 51
print("The large number is: :,d".format(l_number))
print("Large number divided by 51: ", answer)
print("If the check is == original number: ", check2 == 59999568001069198950240354291)
print("Large number divided by 51 as an integer: :,d".format(int_answer))
print("That answer * 51 (should be original number): :,d".format(check))
print("If the integer check is == original number: ", check == 59999568001069198950240354291)
【问题讨论】:
我希望你有一个好的筛子。该数字的下一个素数(在 3 和 17 之后)是 143047654201 该方法找到因子3和17然后将它们相乘得到51,然后将原始数字除以51得到最后一个素因子。 我将 1e7 的参数用于筛子,以及任何大于通过将已知素数相乘并除以数字而找到的其他因子 【参考方案1】:正如您所指出的,由于 64 位双精度可用的精度有限,浮点除法并不精确。
如果您使用整数除法(在 Python 3 中),它会起作用
answer = 59999568001069198950240354291 // 51
这是因为 Python 使用任意精度整数运算。
【讨论】:
非常感谢。如您所见,我对学习 Python 还是个新手,您在这里帮了我很大的忙!!!!以上是关于将两个整数(一大一小)相除时得到错误答案的主要内容,如果未能解决你的问题,请参考以下文章