Считаете значимые цифры в Python? - PullRequest
2 голосов
/ 12 ноября 2011

Есть ли в Python способ подсчитать значащие цифры в двойном / float / и т. Д.?Я не вижу простого способа сделать это, но я ожидаю, что он будет в библиотеке.

Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 12 ноября 2011

Нет.Значимые цифры не так уж и важны и мало поддерживают компьютерные языки.Людям, выполняющим реальные вычисления, нужны погрешности, которые имеют гораздо большую точность - реальные измерения говорят очень точные вещи, такие как «это 0,11 ± 0,03 мм», вместо того, чтобы говорить либо менее точные выражения «это 0,1 мм» или «это 0,11 мм».”Который заставляет вас выбирать степень десяти, даже если ваша неточность на самом деле не падает до степени десяти.

2 голосов
/ 13 ноября 2011

Вас может заинтересовать библиотека с плавающей запятой произвольной точности, такая как эта:

http://code.google.com/p/mpmath/

1 голос
/ 23 ноября 2016

Я нашел решение этого поста в другом вопросе:

Python, подсчитывающий значащие цифры

Идея в том, что вы передаете float как Stringметоды, а затем метод использует регулярные выражения для подсчета количества значащих цифр путем разделения строк, где "e" (для строки с плавающей точкой в ​​научном формате) и где точка (для обычных строк с плавающей точкой).

Кажется, хорошо работает до 8 значащих цифр, но поведение не гарантируется после 9-го числа.

Тем не менее, я считаю, что это лучше, чем

"Значимые цифры не так уж и важны и мало поддерживают компьютерные языки"

ответ.Это может быть нелегко, но вы определенно можете это сделать, даже если не идеально.

1 голос
/ 12 ноября 2011

Компьютеры просто не работают таким образом, по крайней мере, если они не запрограммированы на это. Предположение, что число, которое вы им даете, является точным. Если вы создадите число 2/3 как 0,6666666666666667, то все операции будут обрабатываться именно так. Эта ошибка в младшей значащей цифре может в конечном итоге распространиться на более крупные ошибки в последующих вычислениях, но с этим должен справиться хороший код, используя алгоритмы, которые минимизируют эти проблемы, когда это возможно.

Как я уже сказал, компьютеры делают то, что им говорят. Итак, написаны пакеты, которые используют так называемую интервальную арифметику. Затем число может быть описано как интервал, поэтому мы можем создать 2/3 как интервал [0.6666666666666666,0.6666666666666667]. Мы можем работать с интервалами, складывая, вычитая, умножая и т. Д. Эти операции часто видят увеличение ширины интервалов, когда мы работаем с ними.

Однако факт заключается в том, что даже если вы используете интервальные арифметические инструменты, именно вы должны знать в начале количество значащих цифр в ваших числах. Если вы создадите число как 2.2, сохранив его как двойное, то компьютер фактически попытается сохранить число как 2.200000000000000 и предположить, что все цифры в точности верны. На самом деле, конечно, поскольку используется арифметика с плавающей запятой, число фактически будет храниться внутри как двоичное число. Таким образом, 2.2, вероятно, будет эффективно храниться как число:

2.20000000000000017763568394002504646778106689453125

потому что большинство десятичных дробных чисел не представлены точно в двоичной форме. Опять же, осторожность должна применяться ко всему программному обеспечению, но также всегда человеку, который использует эти инструменты, чтобы понять, что на самом деле означают их цифры.

Этот последний пункт важен. Многие люди относятся к числам, сгенерированным компьютером, как к истине, как сообщается богом компьютеров на каменном планшете. Если компьютер печатает 1.4523656535725, они верят каждой цифре того, что они видят. На самом деле, здесь должен применяться здравый смысл, чтобы знать, что, возможно, это число было сгенерировано из данных, которые имели только 3 значащих цифры, так что вы можете полагаться только на первые несколько значащих цифр этого числа. И, конечно же, именно поэтому вас учат этой концепции в школе, знать, чему доверять, а чему не доверять. Однако помните - компьютеры, как правило, будут бесконечно доверять. Это вы должны применить фильтр.

...