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