2

ds18b20 temp センサーを読み取る Python の関数があります。センサーは、読み取り時間の約 5% で誤った値 (-0.062) を返します。これは問題ではありませんが、グラフでは見栄えが悪いため、値をログに記録したくありません。

if ステートメントの値を「キャッチ」して「#error」に置き換えることができません。以下のコードは問題なく動作しますが、if ステートメントに問題があり、動作していないようです。else の下ですべてが実行されるだけです。

1000 から 1500 までのすべての値 (1000 で割る前の現在の温度の読み取り値) を「キャッチ」して、任意の温度で機能するかどうかを確認しましたが、機能しませんでした。

私のifステートメントが機能しない理由を誰かが知っていますか?

 def readtwo():
    tfile = open("/sys/bus/w1/devices/28-0000040de8fc/w1_slave")
    text = tfile.read()
    tfile.close()
    secondline = text.split("\n")[1]
    temperaturedata = secondline.split(" ")[9]
    temperature = float(temperaturedata[2:])
    temperature = temperature / 1000
    if temperature  == -0.062:
            return("#error")
    else:
            return(temperature)
4

3 に答える 3

3

基数 10floatの (不) 等性をテストすることは、ほとんどの場合間違ったことです。これは、ほとんどの場合、バイナリ システムで正確に表すことができないためです。

私があなたのスニペットを見たところ、文字列と比較し、恐ろしい -0.062 でない場合は float に変換する必要があります。

def readtwo():
    tfile = open("/sys/bus/w1/devices/28-0000040de8fc/w1_slave")
    text = tfile.read()
    tfile.close()
    secondline = text.split("\n")[1]
    temperaturedata = secondline.split(" ")[9]
    temperature = temperaturedata[2:]
    if temperature == '-0062':
            return("#error")
    else:
        temperature = float(temperature) / 1000
        return(temperature)
于 2013-01-29T01:01:22.637 に答える
0

また、残りのコードを少しクリーンアップできる場合もあります。

def readtwo():

    with open("/sys/bus/w1/devices/28-0000040de8fc/w1_slave", 'r') as f:
        secondline = f.readlines()[1]
    temp = secondline.split(' ')[9][2:]

    if '-62' in temp:
        return '#error'
    else:
        return float(temp)/1000
于 2013-01-29T01:08:15.440 に答える
0

10進モジュールについての私のコメントに関係なく、浮動小数点arithemitcには問題があります(Pythonでも)。最も重要なのは、表現エラーのために、紙の上で等しい2つの数値は、プログラムで比較すると等しくないということです。

それを回避する方法は、単にそれらを比較するのではなく、2つの数値間の相対誤差を調べることです。

疑似:

if abs(num1 - num2)/ abs(num2) < epsilon:
    print "They are close enough"

そしてあなたの場合:

if abs(temparture + 0.062)/0.062 < 10**-3:
    return("#error")

基本的に、同じと見なされるように数値が「十分に近い」ことを確認します。

于 2013-01-29T00:57:13.453 に答える