Математика в целых 

Математика в целых 



Некоторое время назад мы занимались анализом одного алгоритма в целочисленной арифметике и в процессе работы потребовалось провести несложное моделирования для повторения результатов. В качестве инструмента был выбран привычный Python. Однако результаты слегка не совпали с теоретическими ожиданиями (у нас большие учёные используют как правило Matlab). Поиск проблемы привел к интересной находке.  

 

Для затравки простой тестовый код на C, который примитивно считает среднее значение двух целых чисел:  

Результат интуитивно ожидаем: 

(5 + 6) / 2 = 5  

(-5 + -6) / 2 = -5  

(5 + -6) / 2 = 0  

(-5 + 6) / 2 = 0  


Однако код на Python выдал отличающийся результат. У нас использовался оператор //, примерно вот так: 

И результаты: 

5 + 6 // 2 = 5 

-5 + -6 // 2 = -6 

5 + -6 // 2 = -1 

-5 + 6 // 2 = 0 

Видно, что округление результата в C/C++ выполняется в сторону 0, формально просто отбрасывание дробной части, а вот в Python происходит округление в сторону -∞. То есть, в коде на Python применялась принципиально другая операция - floor division (деление с округлением вниз). 

Внезапно.

Вывод: матчасть надо знать. И укреплять. 

В качестве ссылок можно посмотреть на пункт 3.3.1 в учебнике по Python, где всё  названо  своими именами, и на PEP238, в котором  описана  мотивация  такого  поведения  (так было не всегда). 



Report Page