Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 11, 2023 13:16:18

Ess
Зарегистрирован: 2023-11-08
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

decimal vs mpmath

нашел интересную особенность :
предположим нужно 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

Отредактировано Ess (Ноя. 11, 2023 13:17:12)

Офлайн

#2 Ноя. 12, 2023 10:52:53

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

decimal vs mpmath

  
>>> 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 выведет столько, сколько сказали вывести.



Отредактировано py.user.next (Ноя. 12, 2023 10:54:02)

Офлайн

#3 Ноя. 13, 2023 10:42:21

Ess
Зарегистрирован: 2023-11-08
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

decimal vs mpmath

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)

Отредактировано Ess (Ноя. 13, 2023 10:43:00)

Офлайн

#4 Ноя. 13, 2023 17:11:31

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

decimal vs mpmath

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 с этим всё в порядке, поэтому там и не нужно никаких дополнительных переменных создавать, а достаточно просто одной строчки, чтобы всё вывести сразу. Это вот неявные признаки того, что лучше написано. Когда ты программист, ты их видишь. Когда ты не программист, ты нихрена не видишь и думаешь, что умнее то, где надо больше всего “умного” писать. Это как в винде: умнее тот, кто больше всего часов просидел и впустую пропялился в кругляшки на экране.



Отредактировано py.user.next (Ноя. 13, 2023 17:43:47)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version