LINUX.ORG.RU

Глюки округления в Python


0

0

Как вам такое "округление"?
Лично я в шоке. Что делать-то? Как в питоне нормально округлять?

$ python
Python 2.3.4 (#1, Sep 7 2004, 16:15:24)
[GCC 3.2.3 20030502 (Red Hat Linux 3.2.3-20)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> round(2.5899999999999999, 2)
2.5899999999999999
>>> round(2.58123, 2)
2.5800000000000001
>>> round(2.59123, 2)
2.5899999999999999

★★

Ишшо один гений компьютерных вычислений.

Ну ка, напиши точное двоичное представление десятичного 0.1, а потом поразмышляй над этим.

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от LX

> Подобное уже обсуждалось

Спасибо за ссылку, но малость не то. Я спрашиваю про функцию round(), вызвав которую, я указал точность два знака. Во-первых, получаем совсем другую точность, во-вторых, значение портится. Обратите внимание на результат:

>>> round(2.59123, 2)
2.5899999999999999

При имевшихся 2.59 получаем 2.58

KtaK ★★
() автор топика
Ответ на: комментарий от watashiwa_daredeska

> Ишшо один гений компьютерных вычислений.
(с благоговением в голосе) Сам то, поди, школу уже закончил?

> Ну ка, напиши точное двоичное представление десятичного 0.1, а потом поразмышляй над этим.

Ну ка, поразмышляй над этим:

>>> '%2.2f' % (2.5899999999999999)
'2.59'
>>> '%2.2f' % (2.59123)
'2.59'
>>> '%2.2f' % (2.58123)
'2.58'

KtaK ★★
() автор топика
Ответ на: комментарий от KtaK

>Ну ка, поразмышляй над этим:

Зачем спрашивать, если ответов не собираешься слушать? Тебе дали _правильный_ ответ на твой вопрос. Предпочитаешь разжеваные ответы?

>'%2.2f' % (2.5899999999999999)

Возьми справочник по командам процессора, найди там описание оператора "%", и поразмышляй над этим :-)

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

> Тебе дали _правильный_ ответ на твой вопрос.
Где? :-O

> Возьми справочник по командам процессора, найди там описание оператора "%", и поразмышляй над этим :-)
Смешная шутка.

KtaK ★★
() автор топика
Ответ на: комментарий от KtaK

>Где? :-O

LX: Подобное уже обсуждалось...

watashiwa_daredeska пояснил: напиши точное...поразмышляй

Если нужно еще больше пояснений - вот: конечной длинны десятичные дроби редко представляются конечной длинны двоичными, процессора чаще всего работают именно с двоичными числами и почти никогда не бывают бесконечной разрядности. Следовательно лучшее приближение к числу 2.59, которое твой процессор может обеспечить - 2.5899999999999999, следующее (2.5900000000000003) в три раза "дальше".

А ('%.2f' %) - функция, возвращающая _десятичное_ представление, потому может работать правильно.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

А теперь обратите внимание, что я не спрашивал, почему так происходит. Вы зря тратите своё время, рассказвая мне об этом, т.к. я и сам могу вам много чего рассказать. Если уж я не точно сформулировал вопрос, прошу прощения. Правильнее было спросить, "как увеличить точность вычислений?".

P.S. Индус Дерипаска, или как там его, со своим дерзким тоном идёт в пешее сексуальное путешествие.

KtaK ★★
() автор топика
Ответ на: комментарий от KtaK

> обратите внимание, что я не спрашивал, почему так происходит.

Ну да, ты просто утверждал, что то, что происходит - неправильно. Тебе указали на обратное.

> зря тратите своё время

Похоже на то

> я и сам могу вам много чего рассказать.

А вот это не похоже.

> Правильнее было спросить, "как увеличить точность вычислений?".

Это "несколько" отличается от первого поста, не находишь?

Варианты:

1. Хакнуть интерпретатор Python на предмет использования extended вместо double (насколько я понимаю, это в основном для i386 архитектуры).

2. Смотреть в сторону GMP: http://www.swox.com/gmp и http://gmpy.sourceforge.net (этот, правда, больше года не обновляется уже, но если чего не хватает, можешь и сам прикрутить).

3. Внимательно подумать, а оно тебе надо? Если важны только два знака после запятой, то мне сложно придумать задачу, для которой при этом не хватит точности double.

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от watashiwa_daredeska

> Похоже на то
...
> А вот это не похоже.
...
> Это "несколько" отличается от первого поста, не находишь?

Не находишь, что твой тон всё-таки чрезмерно вызывающий?

KtaK ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.