Как я могу позволить функции 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'
>>>
Из источника видно, что это задумано (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
У меня нет объяснения, почему это так, но, учитывая, что это не является чем-то неправильным с вашим кодом, вам, вероятно, следует спросить у сопровождающих проекта причину (и, возможно, способ обойти это, если вам это нужно) ).
Это предполагает, что значение равно «истинному нулю», но если вы разделите 0,0008 (5 значащих цифр) на два, вы получите 0,0000, а не 0,0. То есть значение, указывающее, что оно ближе всего к 0,0000 с точностью до четырех или более знаков после запятой. Итак, я интерпретировал вопрос как получить такое значение, кроме как искусственно его вычислить, поскольку оно имеет такое же значение, как 1,0000 против 1,0.
Другими словами: мне кажется, что должен быть способ определить «истинный ноль» (специальный в том же смысле, что +inf и -inf), а также реальное значение, близкое к нулю, с некоторым конкретным значением.
Это не то, как работают значащие цифры. Хотя существуют уровни точности, связанные с измерением чего-то равным нулю, концепция значащих цифр не имеет достаточного количества нюансов, чтобы различать такие детали. Значащие цифры начинаются с первой ненулевой цифры, поэтому все цифры в 0.0000
незначащие. (Кроме того, 0,0008 имеет только одну значащую цифру, 8, и деление ее на 2 дает 0,0004, а не 0,0000.)
Обратите внимание, что если вы попросите mpmath вычислить mpmath.nstr(mpmath.mpf(0.0008), 5, strip_zeros=False)
, он выдаст '0.00080000'
, а не '0.0008'
, указывая на то, что он согласен с тем, что ни один из ведущих нулей не является значащим.
Извините, изменил пример и ввел ошибку, должно было читаться что-то вроде «разделить 0,0001 на 3» - я ценю ваш аргумент о значимости, но в то же время 1,0000 так же бессмысленно, как 0,0000, что явно не в контексте этой библиотеки. (однако, похоже, что автор согласен и по уважительной математической причине - это просто приводит к путанице с ОП)
Что ж, строка документации является явной: «Преобразовать необработанный mpf в десятичный литерал с плавающей запятой с не более чем dps
десятичными цифрами в мантиссе».
Предполагается, что вторым аргументом
nstr
будет количество значащих цифр, но это не имеет значения для 0. В'0.0'
или'0.000000000'
нет значащих цифр, независимо от того, сколько нулей вы добавляете.