1

これは非常に単純なコードのように見えますが、何らかの理由で機能しません。特定の時間に値を出力する必要がありますが、if ステートメントが評価されていないようです。以下は、私がやろうとしていることの基本的なバージョンです。

dt=.1

while t<=10:
     if t==5:
          print('yes')
     t+=.1

私は文字通りこれを自分のコードで試してみましたが、すべての時間ステップで t を出力しましたが、「yes」は出力しません。次のような間隔でコードに他の if ステートメントがあります

if 10<=t<60:
     do stuff

これらの if ステートメントは完全に実行されます。私は試してみましt==5.0t==float(5)が、それが必要な場合に備えて、うまくいきませんでした。これは私を夢中にさせているので、誰かが私を助けてくれればそれは素晴らしいことです. Ubuntu 12.4 の Spyder でこれを実行していますが、import sitecustomize失敗したというメッセージが表示されます。これは何か関係があるでしょうか?私はそのメッセージでしばらくの間コードを実行してきましたが、これまで問題は発生していません。

編集

動作するようになりました、使用しました

if int(t)==5 and t<5+dt:

助けてくれてありがとう

4

5 に答える 5

3

1) 浮動小数点の精度は無限ではありません。浮動小数点はメモリ内で特定のビット数 (通常は 64 または 32) を占有します。

2) 仮数にバイナリ内部表現を使用します (基本的に、最初の桁を除くすべての有効桁数)。

3) .1 はバイナリ表現として正確に格納することはできません。バイナリ ビットの無限に繰り返されるパターンとしてのみ格納できます。また、仮数が非常に大きいため、浮動小数点数は実際には .1 の近似値であり、実際には .1 ではありません。(ただし、0.5 や 0.25 などは可能です)

4) したがって、.1 の合計が完全な結果になるとは限りません。間違った方法で丸めるとエラーが発生します。たとえば、.1 を 10 回追加すると、1.0000...1 または 0.999999...9 になります。

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.htmlを参照してください。すべてのコンピュータ科学者が浮動小数点演算について知っておくべきこと

于 2013-04-11T05:19:27.357 に答える
1

あなたが書いたコードに基づいて書かれた非常に貧弱な例は、私にとっては十分に機能しています。
したがって、精度制御はおそらくあなたが探しているものです:
http://docs.python.org/3.3/library/decimal

    from decimal import *
    getcontext().prec = 3

    dt=.1

    t = 0

    while t <= 10:
        if Decimal(t) == 5:
            print('yes')
        t = Decimal(Decimal(t) + Decimal(dt))
        print(t)
于 2013-04-11T05:52:35.123 に答える
0

これは、t浮動小数点であり、マシン コードで 100% の精度で表されないためです。整数に変換するか、if条件を変更してこの問題を修正する必要があります (整数にキャストするか、不等式を使用します)。

于 2013-04-11T05:18:26.470 に答える
0

これを試して、t(浮動小数点数)を整数に変換してから比較してください..

if int(t) == 5:
   ...

また

import math
t_flr = math.floor(t)
if t_flr == 5:
   ...
于 2013-04-11T05:22:09.360 に答える