Найти - Пользователи
Полная версия: decimal vs mpmath
Начало » Python для новичков » decimal vs mpmath
1
Ess
нашел интересную особенность :
предположим нужно 9/8888888888

как вы думаете кто прав decimal или mpmath ???
Просто интересно ваше мнение

#decimal 1.0125000001012500000101250000010125000001012500000E-9
#mpmath 0.00000000101250000010125000001012500000101250000010125


 import decimal  
decimal.setcontext(decimal.Context(prec=50))
print(decimal.Decimal('9') / decimal.Decimal('8888888888'))
#1.0125000001012500000101250000010125000001012500000E-9
#-------------------------------------------------------------------------------------
from mpmath import mp
mp.dps = 50
result = mp.mpf(9) / mp.mpf(8888888888)
print(result)
#0.00000000101250000010125000001012500000101250000010125

py.user.next
  
>>> import decimal
>>> 
>>> decimal.setcontext(decimal.Context(prec=60))
>>> decimal.Decimal('9') / decimal.Decimal('8888888888')
Decimal('1.01250000010125000001012500000101250000010125000001012500000E-9')
>>> 
>>> decimal.setcontext(decimal.Context(prec=50))
>>> decimal.Decimal('9') / decimal.Decimal('8888888888')
Decimal('1.0125000001012500000101250000010125000001012500000E-9')
>>>
>>> len('1.0125000001012500000101250000010125000001012500000E')
52
>>>
  
>>> from mpmath import mp
>>> 
>>> mp.dps = 50
>>> result = mp.mpf(9) / mp.mpf(8888888888)
>>> print(result)
0.00000000101250000010125000001012500000101250000010125
>>> 
>>> len('0.00000000101250000010125000001012500000101250000010125')
55
>>>
Ess
как вы думаете кто прав decimal или mpmath ???
Прав decimal.

Если предположить, что число будет бесконечно малым, то mpmath будет выводить и выводить что-то на экран, пока не дойдёт до ненулевой цифры, до которой она никогда не дойдёт. И в то же время decimal выведет столько, сколько сказали вывести.
Ess
py.user.next
h будет выводить и выводить что-то на экран
и у decimal и у mpmath задана точность округления 50 знаков

а при бесконечно малом числе результат у них будет одинаковый
1.0124873439082011474856564292946338170772865339183E-100
1.0124873439082011474856564292946338170772865339183e-100

 decimal.setcontext(decimal.Context(prec=50))
print(decimal.Decimal('9') / decimal.Decimal('88889999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999888888'))
#1.0125000001012500000101250000010125000001012500000E-9
from mpmath import mp
mp.dps = 50
result = mp.mpf(9) / mp.mpf(88889999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999888888)
print(result)
py.user.next
Ess
и у decimal и у mpmath задана точность округления 50 знаков
Ну да, и поэтому mpmath выводит какую-то лишнюю ерунду. Для чего указывается фиксированная точность? Для того, чтобы дальше ничего не считалось и выводилось столько, сколько задали в этой точности. Ну decimal так и делает. А что же делает mpmath? Оно берёт эту точность, вычисляет, а потом ещё берёт что-то дополнительно после этой точности. Зачем? Она как считает, для чего ей точность задали, ограниченную вот дотуда-то? Просто так что ли? Или что? Поэтому сразу видно, что человек, который писал, у него что-то не то с головой, потому что он не понимает, зачем указывают точность. Во всех языках при указании точности последнюю цифру просто округляют по тем цифрам, которые дальше идут, за пределами заданной точности, и всё.

Я же показал, я задаю 50, а оно выводит 55 знаков (отнимаем “0.”, получается 53 знака). С чего вдруг-то? В то же время decimal выводит столько, сколько ему задали. Он выводит 52, но два идут на точку и на E, а остальные 50 идут только на все цифры мантиссы. Поэтому decimal прав, а вот этот вот mpmath какой-то творческий дурачок писал.

Вот, почитай философию UNIX по созданию программ
wiki. философия UNIX

И там есть такое правило
wiki. правило наименьшего удивления

Вот ты задаёшь точность 50, а mpmath выводит тебе 55. А если ты задашь ей 100, она сколько выведет? будешь играть в угадайку? Так вот такого быть не должно. Поэтому decimal сделан умнее, чем mpmath, так как он выводит то, что ему заказывают, и не удивляет пользователя.

А что такое “удивление” пользователя? Это ты берёшь и тратишь время пользователя на то, чтобы пользователь сначала проверил, как там твоя программа тупая работает, которой он решил попользоваться, потому что сразу понять и предсказать её поведение без каких бы то ни было проверок он не может, так как твоя программа постоянно подбрасывает ему сюрпризы то тут, то там.

Ну, например, вот пример из жизни. Ты садишься за комп, включаешь его, чтобы поработать на нём, виндовс загружается и раз и начинает выполнять обновление системы, которое ты не просил выполнять. И ты сидишь ждёшь это колечко, которое тебе два часа говорит “подождите немного, идёт обновление”. Вот оно тебе надо? Ты - пользователь, тебе оно нафиг не надо, тебе надо Word открыть и набирать документ, потому что его сдавать через три часа. А ты не можешь Word открыть, потому что эта херня делает вообще что-то другое, чего ты не ждал и чего тебе не надо было. А после обновления виндовс ты ждёшь каких-то новшеств, обновление же не просто так произошло и ты не просто так его ждал вместо своих дел. Ты смотришь и опять удивляешься - разницы ты вообще не видишь никакой. И вот ты в итоге удивился тому, как ты три часа просидел за компом, а в документе, нужном тебе, не набрал ни строчки. Какая-то параша обновилась только за счёт твоего времени. Это вот то, почему Windows - говно, а UNIX - легенда.

Кстати, обрати внимание, что с decimal также легко работать, в то время как с mpmath нужно какие-то переменные создавать дополнительные, чтобы просто понятный и полный результат выводить. Это о чём говорит? Это говорит о том, что разработчик mpmath не очень-то шарит в программировании и вообще с нормальными программами не работал, поэтому и не знает, что такое удобные программы и свою такой же сделать не может. О вкусе устриц может размышлять только тот, кто их уже ел. А у decimal с этим всё в порядке, поэтому там и не нужно никаких дополнительных переменных создавать, а достаточно просто одной строчки, чтобы всё вывести сразу. Это вот неявные признаки того, что лучше написано. Когда ты программист, ты их видишь. Когда ты не программист, ты нихрена не видишь и думаешь, что умнее то, где надо больше всего “умного” писать. Это как в винде: умнее тот, кто больше всего часов просидел и впустую пропялился в кругляшки на экране.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB