Преброяване на значими цифри в Python?

Има ли начин в Python да се преброят значимите цифри в double/float/etc? Не виждам лесен начин да направя това, но бих очаквал да е в библиотеката.

Благодаря предварително.


person user456584    schedule 12.11.2011    source източник
comment
Едно число по своята същност не има брой значими цифри. Вие определяте колко значими цифри искате да покажете за число. Това ли искаш да направиш?   -  person tjm    schedule 12.11.2011
comment
Как определяте „значимите фигури“?   -  person Johnsyweb    schedule 12.11.2011
comment
@tjm едно число всъщност има значими цифри. Броят на значимите цифри съобщава точността на вашето измерване. Вижте en.wikipedia.org/wiki/   -  person Will    schedule 12.11.2011
comment
@Уил, трябва да не съм съгласен. Точка три във вашата връзка например гласи: Задните нули в число, съдържащо десетична запетая, са значими. Е, въоръжени с това, вземете представянията 2,25, 2,250 и 2,2500000. Числото във всеки случай е 2 и четвърт, но те имат съответно 3, 4 и 8 значещи цифри. И така, какъв е присъщият брой значещи цифри за числото 2 и една четвърт?   -  person tjm    schedule 12.11.2011
comment
@tjm Ах, разбирам мисълта ти. Погрешно изтълкувах изказването ти. Всяка функция за намиране на sig fig определено ще трябва да приеме низово представяне на число като вход.   -  person Will    schedule 12.11.2011
comment
Подобен въпрос за броене на sig figs.   -  person The Demz    schedule 07.10.2012


Отговори (5)


Не. Значимите цифри просто не са толкова голяма работа и получават малко поддръжка в компютърните езици. Хората, които правят реални изчисления, се нуждаят от ленти за грешки, които имат много по-голяма точност - реалните измервания казват много точни неща като „това е 0,11 ± 0,03 mm“, вместо да казват едно от по-малко точните твърдения „това е 0,1 mm“ или „това е 0,11 mm ”, което ви кара да изберете степен на десет, дори ако вашата неточност всъщност не попада на степен на десет.

person Brandon Rhodes    schedule 12.11.2011
comment
Значимите цифри са изключително важни и са необходими за проследяване на точността на измерванията, дори и с ленти за грешки. Има няколко известни случая, при които игнорирането на значими цифри е довело до неправилни резултати. - person Will; 12.11.2011
comment
Значимите цифри са много важни за децата в училище, защото са лесни за използване, но в „говора със значими цифри“ мярката 0,10 означава „0,10 ± 0,01“, а 0,100 означава „0,100 ± 0,001“. Искам да кажа, че значимите цифри са опростяване на по-общата концепция за грешка при измерване и следователно научните математически библиотеки ще поддържат грешки, а не значими цифри. Защото, както намекнах в отговора си, грешката има тенденция да има всякакви стойности и рядко се случва да се приземи точно на степен десет. :) - person Brandon Rhodes; 12.11.2011
comment
Не се присмивайте толкова много на сиг смокини, те са важни за другите, освен за децата в училище. Физиците, например, ги използват през цялото време, когато точността на грешката на измерване не е толкова важна. - person Will; 12.11.2011
comment
Прав си — трябваше да кажа „важно, когато върша работа на ръка или неофициално, преди да подготвя математиката за действително публикуване“ — и бих се върнал и коригирах формулировката си „деца в училище“, ако не беше фактът, че има 31 минути премина и похвалата не може да се редактира. въздишка - person Brandon Rhodes; 12.11.2011

Може да се интересувате от библиотека с плаваща запетая с произволна точност като тази:

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

person Mr.Wizard    schedule 13.11.2011

Намерих решение на тази публикация в друг въпрос:

Python брои значими цифри

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

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

Все пак вярвам, че това е по-добро от

„Значимите цифри просто не са толкова голяма работа и получават малка поддръжка в компютърните езици“

отговор. Може да не е лесно, но определено можете да го направите, дори и не перфектно.

person Flame_Phoenix    schedule 23.11.2016

Компютрите просто не работят по този начин, поне освен ако не са програмирани да го правят. Предположението е, че числото, което им давате, е точно. Ако създадете числото 2/3 като 0,6666666666666667, тогава всички операции го третират като точно това. Тази грешка в най-малката цифра може в крайна сметка да се разпространи до по-големи грешки при по-късни изчисления, но това е нещо, с което добрият код трябва да се справи, като използва алгоритми, които минимизират тези проблеми, когато е възможно.

Както казах обаче, компютрите правят това, което им се каже. Така че има написани пакети, които използват така наречената интервална аритметика. Тогава едно число може да бъде описано като интервал, така че можем да създадем 2/3 като интервал [0.6666666666666666,0.6666666666666667]. Можем да оперираме с интервали, като добавяме, изваждаме, умножаваме и т.н. При тези операции ширините на интервалите често се разширяват, докато работим с тях.

Факт е обаче, че дори и да използвате инструменти за интервална аритметика, ВИЕ трябва да знаете в началото броя на значимите цифри във вашите числа. Ако създадете число като 2.2, съхранявайки го като двойно, тогава компютърът всъщност ще се опита да съхрани числото като 2.200000000000000 и ще приеме, че всички цифри са точно правилни. Всъщност, разбира се, тъй като се използва аритметика с плаваща запетая, числото всъщност ще се съхранява вътрешно като двоично число. Така че 2.2 вероятно ще бъде ефективно съхранено като число:

2.20000000000000017763568394002504646778106689453125

защото повечето десетични дробни числа не могат да бъдат представени точно в двоична форма. Отново трябва да се внимава във всеки софтуер, но винаги и от лицето, което използва тези инструменти, за да разбере какво наистина означават техните числа.

Тази последна точка е важна. Много хора приемат числата, генерирани от компютър, като истина, предадена от компютърния бог върху каменна плоча. Ако компютърът отпечата 1.4523656535725, те вярват на всяка цифра от това, което виждат. Всъщност тук трябва да се приложи здрав разум, за да се знае, че може би това число е генерирано от данни, които имат само 3 значими цифри, така че можете да изберете да разчитате само на първите няколко значими цифри от това число. И разбира се, това е причината да ви учат на тази концепция в училище, да знаете на какво да вярвате и на какво не. Не забравяйте обаче - компютрите като цяло ще бъдат безкрайно доверчиви. Вие трябва да приложите филтъра.

person Community    schedule 12.11.2011

Вградената Decimal библиотека може да помогне доста добре с това, тъй като заобикаля опасенията с използването на хардуерно базирани числа с плаваща запетая. Има вътрешно представяне, което съдържа само значимите цифри и експонентата. Така че можете да използвате това, за да преброите значими цифри като това:

from decimal import Decimal
def count_sigfigs(numstr):
    return len(Decimal(numstr).normalize().as_tuple().digits)
 

Това работи доста добре за много примери, като тези (от този свързан въпрос). Имайте предвид, че трябва да въведете числата като низове, за да работи правилно. Използването на float би го объркало поради тяхното хардуерно представяне.

tests = [('2', 1),
 ('1234', 4),
 ('2.34', 3),
 ('3000', 1),
 ('0.0034', 2),
 ('120.5e50', 4),
 ('1120.5e+50', 5),
 ('120.52e-50', 5)]

for num, expected in tests:
    print(count_sigfigs(num) == expected)

Което дава:

True
True
True
True
True
True
True
True

За съжаление това не работи съвсем с числа като 1000, които имат 4 sigfigs. Това просто дава 1. Така че ще има нужда от подобрение, за да обхване всички случаи. Също така дава 1 за 0, въпреки че обикновено трябва да дава 0.

Ако извадите normalize, тогава той работи за 1.000, но не и за 3000 (пише 4, а не 1).

person partofthething    schedule 09.07.2021