0

私は結果が非常に奇妙だと思います。なぜ0.3ではないのですか?この結果の理由を誰か教えてください。これを修正することは可能ですか。

 ?- X is 5.3-5.
    X = 0.2999999999999998.

    ?- 

2 番目の質問は、「時間」表記「13.45」---->「15.30」を時間数に変換するにはどうすればよいですか? たとえば、上記の計算された 15.30-13.45 の期間は 1.85 になります。しかし、残りの数字ではなく、時間の一部を操作する必要があります。15 1/2 - 13 /4 のように、この方法の方が優れています。私は試します

?- X is (5.3-5)*100/60.
X = 0.4999999999999997.

?- X is (5.3-5)*100//60.
ERROR: ///2: Type error: `integer' expected, found `29.999999999999982'

助言がありますか?

4

3 に答える 3

4

SWIから得た答えは正しいです。
多くのプログラミング言語、および実質的にすべての Prolog システムでは、浮動小数点の実装はバイナリ (基数 = 2) システムに基づいています。このシステムでは数値5.3を正確に表すことができないため、近似値が選択されます。減算は、このような不正確さを明らかにするのに特に適しています。

?- X is 5.3-5-0.3.
X = -1.6653345369377348e-16.

2 のべき乗の合計 ( 2 -1、 2 -2、... を含む) である数値を使用している限り、背後にある float の精度が許す限り、正確な結果が得られます。

?- X is 5.000244140625-5-0.000244140625.
X = 0.0.

ISO 準拠の Prolog システムしなければならないことは、 float を write-option で書き込むときに、quoted(true)正確に読み戻せるような方法で float が書き込まれるようにすることです。

2番目の質問について(//)/2は、整数のみで定義されています。浮動小数点を整数に変換したい場合は、ISO Prolog に通常の LIA-1 関数があります。

floor/1, truncate/1, round/1, ceiling/1.

?- X is round(5.3).
X = 5.

ただし、(div)/2の代わりに使用することをお勧めし(//)/2ます。の意味は(//)/2LIA-1:2012 (標準 ISO/IEC 10967-1:2012) でサポートされなくなりました — 正当な理由があります。詳細については、これこの回答を参照してください。

于 2014-02-25T17:15:27.757 に答える
2

この行について:

X is (5.3-5)*100//60.

述語は具体的には//整数除算であり、浮動小数点数を操作しています。これを行うことができます:

X is round((5.3-5)*100/60).

または

X is round((5.3-5)*100)//60.

もちろん、どちらの場合も、フロートを行っているかどうか0についてのことなので、わかります。0.3そのため、それが本当に意図したものかどうかは不明です。

その他の興味深いオプション:

?- X is (5.3-5)*100/ 60.
X = 0.4999999999999997.

?- X is float(round((5.3-5)*100) rdiv 60).
X = 0.5.
于 2014-02-25T16:59:29.540 に答える
2

これは、(ほぼ* ) 常に不完全な浮動小数点演算によるものです。コンピュータは 2 進数で動作しますが、人々はほとんど 10 進数で動作します。これにより、あちこちで不正確さが生じます。不正確さがどれほど悪いかは、問題のハードウェアと (場合によっては) ソフトウェアがどのように機能するかによって異なります。しかし重要なのは、エラーが発生するということだけを正確に予測することはできないということです。

5.3-5その結果、正確に0.3;になるとは期待できません。代わりに、それが本当に近いかどうか(0.00000000000001 以内など)をテストする必要があります。2 番目の例のような結果が得られた場合、結果を使用する前に明示的に整数に変換する必要があります。この回答で詳細を読むことができます

[脚注:] 以下のコメントに従って、たまたま 2 のべき乗 (つまり、2^i) または 2 のべき乗の和 (たとえば、7=4+2+1) である浮動小数点数を使用して、その算術演算を追加します。コンピューターで正確に計算できます。これが実際に「浮動小数点演算」であるかどうかについては、哲学的な議論があります。しかし、たとえば、ほとんどの言語が であると報告する理由を説明していますが、 の2.0 + 1.0よう30.2 + 0.1もの0.30000000000000004です。

于 2014-02-25T16:47:56.693 に答える