Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 19, 2019 11:47:56

Neskazhui
Зарегистрирован: 2019-04-19
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Произведение множителей не совпадает с исходным числом

Приветствую!

Есть два больших числа:
x = 131158418633125768138423674409070931693027476165633955142034418510136533205342942908180626591619491740423366691461424787672338239349695041293541585461382577849020116487088500553236655324444570419972596873736037440690801359396690700348429938020953538258568079532966610461079245006824764025401619034266887281579
y = 11298074779406867643323870100097334800590034823281809866918264946896423935183110944876200664016379108784946126702256387422951005442469553642837132067306523

Делю одно на другое, получаю z :
z = x / y = 11608917554005726684452334020617237473283411851303072689503025461262759023091778202358129976438625668446844450363938567929777894863497608779625981397696512

Для проверки делаю обратное действие:
x2 = z * y = 131158418633125764258290336896419271315810615504953084257241366171595458346863922512002768375620070655683057713555016494080114169772079683717393186400442419673218035020880829350843878811330017577362887584534586079793721938971354462324377338779914548261934233231194477363426851579583393796436835901625233047552

И вижу, что числа разные. Совпадают только первые 17 знаков. Вопрос: почему?

Офлайн

#2 Апрель 19, 2019 12:23:34

first-step
Зарегистрирован: 2015-09-21
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Произведение множителей не совпадает с исходным числом

В этом нет ничего страшного. Не обращайте внимания ) бывает и хуже ситуации

Офлайн

#3 Апрель 19, 2019 12:47:02

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Произведение множителей не совпадает с исходным числом

Neskazhui
Совпадают только первые 17 знаков. Вопрос: почему?
Скорее всего, числа дробные, а дробные числа имеют ограниченную точность.

  
>>> n1
131158418633125768138423674409070931693027476165633955142034418510136533205342942908180626591619491740423366691461424787672338239349695041293541585461382577849020116487088500553236655324444570419972596873736037440690801359396690700348429938020953538258568079532966610461079245006824764025401619034266887281579
>>> n2
11298074779406867643323870100097334800590034823281809866918264946896423935183110944876200664016379108784946126702256387422951005442469553642837132067306523
>>> n3 = divmod(n1, n2)[0]
>>> n3
11608917554005727050577194426734082860989444014788750284473538256838699740238485532550251743043271566166570820746019480868564692112726936259914035638269873
>>> n3 * n2 == n1
True
>>>



Офлайн

#4 Апрель 19, 2019 12:48:14

lefmails
Зарегистрирован: 2019-04-15
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Произведение множителей не совпадает с исходным числом

Наверное зависит от типа данных int, float и тд. они же ограничены в размере

Офлайн

#5 Апрель 19, 2019 15:24:54

Neskazhui
Зарегистрирован: 2019-04-19
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Произведение множителей не совпадает с исходным числом

Числа целые, проверял с помощью x.is_integer().

Офлайн

#6 Апрель 19, 2019 15:30:39

Neskazhui
Зарегистрирован: 2019-04-19
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Произведение множителей не совпадает с исходным числом

py.user.next
Ваш вариант сработал. Удивительно. Спасибо!

Офлайн

#7 Апрель 19, 2019 16:32:14

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Произведение множителей не совпадает с исходным числом

Neskazhui
Числа целые, проверял с помощью x.is_integer().
Деление по умолчанию даёт вещественный результат. (Во втором питоне целочисленный, в третьем питоне вещественный.)

Кстати, если точно знаешь, что оно делится нацело, то можешь целочисленное деление использовать:
  
>>> n1 = 131158418633125768138423674409070931693027476165633955142034418510136533205342942908180626591619491740423366691461424787672338239349695041293541585461382577849020116487088500553236655324444570419972596873736037440690801359396690700348429938020953538258568079532966610461079245006824764025401619034266887281579
>>> n2 = 11298074779406867643323870100097334800590034823281809866918264946896423935183110944876200664016379108784946126702256387422951005442469553642837132067306523
>>> n3 = n1 // n2
>>> n3
11608917554005727050577194426734082860989444014788750284473538256838699740238485532550251743043271566166570820746019480868564692112726936259914035638269873
>>> n3 * n2 == n1
True
>>>
Если же не знаешь точно, делится или нет нацело, то надо divmod() и проверять остаток от деления (правое число результата).



Отредактировано py.user.next (Апрель 19, 2019 16:32:42)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version