由错误引起的重要数字值

时间:2014-05-07 17:27:10

标签: python numpy rounding scientific-computing

我需要一个函数,只返回给定错误的值的重要部分。意思是这样的:

def (value, error):
    """ This function takes a value and determines its significant
        accuracy by its error.
        It returns only the scientific important part of a value and drops the rest. """

    magic magic magic....

    return formated value as String.

到目前为止我写的内容是为了表明我的意思:

import numpy as np

def signigicant(value, error):
    """ Returns a number in a scintific format. Meaning a value has an error
        and that error determines  how many digits of the
        value are signifcant. e.g. value = 12.345MHz, 
        error = 0.1MHz => 12.3MHz because the error is at the first digit.
        (in reality drop the MHz its just to show why.)"""


    xx = "%E"%error    # I assume this is most ineffective.
    xx = xx.split("E")
    xx = int(xx[1])

    if error <= value: # this should be the normal case
        yy = np.around(value, -xx)

        if xx >= 0: # Error is 1 or bigger
            return "%i"%yy

        else: # Error is smaller than 1
            string = "%."+str(-xx) +"f"
            return string%yy

    if error > value: # This should not be usual but it can happen.
        return "%g"%value

我不想要的是像周围或周围的numpys一样的功能。这些函数需要一个值,并想知道这个值的哪个部分很重要。重点是,一般来说,我不知道有多少位数是重要的。它取决于该值的误差大小。 另一个例子:

值= 123,错误= 12,=&gt; 120 可以删除3,因为错误大小为10.但是这种行为并不那么重要,因为有些人仍然会为值写入123。这里没关系,但不完全正确。

对于大数字,“g”字符串运算符是一个可用的选择,但并不总是我需要的。对于例如 如果错误大于该值(例如,当某人想要测量不存在的东西时)。

值= 10,错误= 100

我仍然希望将10作为价值,因为我更了解它。该函数应该返回10而不是0.

我写的东西或多或少都有用,但它显然无论如何都没有效果或优雅。此外,我认为这个问题涉及数百人,因为每个科学家都必须以这种方式格式化数字。所以我确定在某个地方有一个现成的解决方案,但我还没有找到它。 可能我的谷歌技能不够好,但我在两天内无法找到解决方案,现在我问这里。

为了测试我的代码,我使用了以下内容,但需要更多代码。

errors = [0.2,1.123,1.0, 123123.1233215,0.123123123768]
values = [12.3453,123123321.4321432, 0.000321 ,321321.986123612361236,0.00001233214 ]

for value, error in zip(values, errors):
print "Teste Value: ",value, "Error:", error
print "Result: ", signigicant(value, error)

1 个答案:

答案 0 :(得分:1)

import math

def round_on_error(value, error):
    significant_digits = 10**math.floor(math.log(error, 10))
    return value // significant_digits * significant_digits

示例:

>>> errors = [0.2,1.123,1.0, 123123.1233215,0.123123123768]
>>> values = [12.3453,123123321.4321432, 0.000321 ,321321.986123612361236,0.00001233214 ]
>>> map(round_on_error, values, errors)
[12.3, 123123321.0, 0.0, 300000.0, 0.0]

如果你想保留一个低于错误的值

if (value <  error)
    return value
else
    def round_on_error(value, error):
    significant_digits = 10**math.floor(math.log(error, 10))
    return value // significant_digits * significant_digits