Python mpmath nstr зачищать нули не

Как я могу позволить функции python mpmath.nstr сохранить все конечные нули для mpmath.mpf('0')? Похоже, что необязательный аргумент strip_zeros не работает для mpmath.mpf('0'), как показано в следующем примере:

Python 3.8.5 (default, Jul 28 2020, 12:59:40) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import mpmath
>>> mpmath.dps=30
>>> mpmath.nstr(mpmath.mpf('0'), 10, strip_zeros=False)
'0.0'
>>> mpmath.nstr(mpmath.mpf('1'), 10, strip_zeros=False)
'1.000000000'
>>> 
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
135
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из источника видно, что это задумано (https://github.com/fredrik-johansson/mpmath/blob/master/mpmath/libmp/libmpf.py) в to_str():

    # Special numbers
    if not s[1]:
        if s == fzero:
            if dps: t = '0.0'
            else:   t = '.0'
            if show_zero_exponent:
                t += 'e+0'
            return t
        if s == finf: return '+inf'
        if s == fninf: return '-inf'
        if s == fnan: return 'nan'
        raise ValueError

У меня нет объяснения, почему это так, но, учитывая, что это не является чем-то неправильным с вашим кодом, вам, вероятно, следует спросить у сопровождающих проекта причину (и, возможно, способ обойти это, если вам это нужно) ).

Предполагается, что вторым аргументом nstr будет количество значащих цифр, но это не имеет значения для 0. В '0.0' или '0.000000000' нет значащих цифр, независимо от того, сколько нулей вы добавляете.

user2357112 14.12.2020 02:59

Это предполагает, что значение равно «истинному нулю», но если вы разделите 0,0008 (5 значащих цифр) на два, вы получите 0,0000, а не 0,0. То есть значение, указывающее, что оно ближе всего к 0,0000 с точностью до четырех или более знаков после запятой. Итак, я интерпретировал вопрос как получить такое значение, кроме как искусственно его вычислить, поскольку оно имеет такое же значение, как 1,0000 против 1,0.

Grismar 14.12.2020 03:37

Другими словами: мне кажется, что должен быть способ определить «истинный ноль» (специальный в том же смысле, что +inf и -inf), а также реальное значение, близкое к нулю, с некоторым конкретным значением.

Grismar 14.12.2020 03:38

Это не то, как работают значащие цифры. Хотя существуют уровни точности, связанные с измерением чего-то равным нулю, концепция значащих цифр не имеет достаточного количества нюансов, чтобы различать такие детали. Значащие цифры начинаются с первой ненулевой цифры, поэтому все цифры в 0.0000 незначащие. (Кроме того, 0,0008 имеет только одну значащую цифру, 8, и деление ее на 2 дает 0,0004, а не 0,0000.)

user2357112 14.12.2020 06:17

Обратите внимание, что если вы попросите mpmath вычислить mpmath.nstr(mpmath.mpf(0.0008), 5, strip_zeros=False), он выдаст '0.00080000', а не '0.0008', указывая на то, что он согласен с тем, что ни один из ведущих нулей не является значащим.

user2357112 14.12.2020 06:20

Извините, изменил пример и ввел ошибку, должно было читаться что-то вроде «разделить 0,0001 на 3» - я ценю ваш аргумент о значимости, но в то же время 1,0000 так же бессмысленно, как 0,0000, что явно не в контексте этой библиотеки. (однако, похоже, что автор согласен и по уважительной математической причине - это просто приводит к путанице с ОП)

Grismar 14.12.2020 06:20

Что ж, строка документации является явной: «Преобразовать необработанный mpf в десятичный литерал с плавающей запятой с не более чем dps десятичными цифрами в мантиссе».

paxdiablo 14.12.2020 07:32

Другие вопросы по теме