2016-05-21 2 views
1

Я пытаюсь реализовать алгоритм поиска LCM. Он должен найти LCM для очень больших чисел.Ошибка вычисления Python

LCM найдена с помощью формулы,

LCM(A, B) = (A * B)/GCD(A, B) 

, где А и В являются два входа.

Вход: 226553150 1023473145
Так, LCM = (226553150 * 1023473145)/5
Должно быть, 46374212988031350.

Но python находит это как 46374212988031352, что, очевидно, является ошибкой. Как решить эту проблему? python screenshot

+1

Математика с плавающей точкой ** неточна **. –

+0

Вы можете узнать больше о границах плавающих точек здесь: https://docs.python.org/2/tutorial/floatingpoint.html – Keiwan

+0

Похоже, это курс Курсера, я вижу, что есть вопрос [C] по тому же вопросу ] (http://stackoverflow.com/questions/36540103/lowest-common-multiple-with-doubles-in-c). –

ответ

2

Вы используете математику с плавающей запятой, потому что вы использовали оператор деления . Плавающая точка может приближаться только к большим числам, а результат разности - результат этого.

Используйте // пол деление вместо:

>>> (226553150 * 1023473145) // 5 
46374212988031350 

Этаж деление на целых никогда не требует преобразования, чтобы плавать, избегая точности вопросов.

В качестве альтернативы, используйте decimal module для более точности математики с вещественными числами:

>>> from decimal import Decimal 
>>> Decimal('226553150') * Decimal('1023473145')/Decimal('5') 
Decimal('46374212988031350') 

Это медленнее, чем при использовании float.

Смежные вопросы