Форум сайта python.su
Всем привет!
Подскажите, пожалуйста, кто знает почему на Python 3.6 при попытке посчитать длинные целые числа, получается неверный ответ:
print(int(-9999999999 * 10000000002 / 2))
print(int(-(10**10-1) * (10**10+2) / (2**1)
>>-50000000005000003584
>>-50000000005000003584
-50000000004999999999
Офлайн
Во втором питоне деление по дефолту целочисленное, то есть 10000000002 / 2 - целое, а в третьем результат деления по умолчанию дает float. Если вы точно знаете, что результат деления будет целым, то можно делить так 10000000002 // 2
Офлайн
FishHook
Во втором питоне деление по дефолту целочисленное, то есть 10000000002 / 2 - целое, а в третьем результат деления по умолчанию дает float. Если вы точно знаете, что результат деления будет целым, то можно делить так 10000000002 // 2
Офлайн
UncleFather
Почему так? Разве питон, когда считает во floate, отбрасывает какую-то часть числа?
Офлайн
да как-то напрягает, когда java выдает одинаковые ответы
System.out.println(new BigDecimal("1000000000000000000000000002").divide(BigDecimal.valueOf(2)));
>>500000000000000000000000001
System.out.println(new BigInteger("1000000000000000000000000002").divide(BigInteger.valueOf(2)));
>>500000000000000000000000001
print(int(1000000000000000000000000002 / 2))
500000000000000006643777536
print(int(1000000000000000000000000002 // 2))
>>500000000000000000000000001
Офлайн
UncleFather
я понимаю, когда отбрасывается дробная часть…. но целую-то часть отбрасывать незачем.
Офлайн
UncleFatherПотому что Decimal. Очень странно, что в java вы с удовольствием используете этот тип, а в питоне не хотите
да как-то напрягает, когда java выдает одинаковые ответы
from decimal import Decimal print((Decimal(1000000000000000000000000002) / 2)) >>>500000000000000000000000001
Офлайн
FishHookСпасибо))), просто не знал про Decimal в питоне.
Потому что Decimal. Очень странно, что в java вы с удовольствием используете этот тип, а в питоне не хотите
FishHookЭто-то я помню. Для меня вопрос заключался немного в другом. А именно - если везде пишут, что длинная арифметика встроена в питон, то значит, что под переменную float и int питон должен выделять не 32 бита, как в других языках (и даже не 64), а столько, сколько потребуется. Если для других языков объем памяти для хранения переменных четко прописан и найти это в сети достаточно легко, то для питона, если это где-то и записано, то еще нужно постараться найти. А поскольку сразу не нашел - отсюда и заблуждение.
Это потому что вы плохо представляете, как float хранится в памяти. Вот почитайте. Грубо говоря, float - это маленькая голова целого, длинный хвост дроби и степень двойки. Когда вы приводите float к целому вы побитово сдвигаете хвост на степень знаков.
g = 9999999999999999999999
Decimal(1 + g) / 2 * g
Офлайн
UncleFatherНу тогда простая операция 1 / 3 сожрет всю память вашего компьютера
что под переменную float и int питон должен выделять не 32 бита, как в других языках (и даже не 64), а столько, сколько потребуется
Офлайн
UncleFatherВ питоне можно переопределять операторы. Понятно что Decimal(x) * 4 -> умножение вызовет метод у объекта Decimal и этот метод вернет опять Decimal. А 4 * Decimal(x) - нет.
Последний вопрос - если есть подозрение, что мы выскочим из long-а, то в формуле, там где происходит первое действие, нужно прописать Decimal, а остальная часть уже сама будет считаться как Decimal?
Офлайн