1

マキシマで私はします:

(%i1) 1.4*28;

(%o1) 39.2

(%i2) is(1.4*28=39.2);

(%o2) false

これは私には奇妙ですが、おそらくラットの交換と関係がありますか?

maximaが「true」の入力に「true」を返すようにする方法はあり is(1.4*28=39.2);ますか?

4

2 に答える 2

3

浮動小数点ガイドから:

0.1 + 0.2のような私の数値を合計すると、良いラウンド0.3になりませんが、代わりに0.30000000000000004のような奇妙な結果が得られますか?

内部的には、コンピューターは0.1、0.2、0.3などの数値を正確に表すことができない形式(2進浮動小数点)を使用しているためです。

コードがコンパイルまたは解釈されるとき、「0.1」はすでにその形式で最も近い数値に丸められているため、計算が行われる前でも小さな丸め誤差が発生します。

あなたの場合、1.4と39.2の両方が2進数として正確に表現できるわけではなく、計算結果は文字通りの39.2とは異なる方法で丸められることになります。

このような問題を回避したい場合は、バイナリフロートの使用を回避する必要があります。Maximaでは、これは適切な分数を使用することで最も簡単に実行できると思います。

is(14/10 * 28 = 392/10)

動作するはずです

于 2011-06-12T21:51:40.920 に答える
3

「通常の」電卓はそのような質問を間違えるので、時々、あなたの問題を本当に解決するものが明確ではありません。自動算術テストを設定して、人々が正しい答えを得ることができるかどうかを確認する場合、テストする必要があるのは、ある程度の許容範囲までの合意です。

(電卓の例は、1.0 / 3.0のバリエーションを計算してから、3を掛けることで作成できます。0.9999になる可能性があります。 30.0)

Maximaに戻ると、abs(ab)<許容値、またはおそらくabs((ab)/ max(a、b))<相対許容値かどうかをテストできます。

ここで、問題を実際に解決するのがOUTPUTの精度が低い場合は、fpprintprec:5を設定して小数点以下5桁(四捨五入)を取得できます。

別の方法は、3.1が実際にはバイナリに変換されないように数値を読み取ることですが、最初は3+1/10として解析されます。その時点から、すべての有理演算を正確に実行できます。(有理算術には、平方根、ログ、コサイン...は含まれず、+-* /と整数乗のみが含まれます)。現在、これはMaximaの一部ではありません。

ちなみに、0.1 + 0.2の例は、wxmaximaの表示では0.3と表示されます。ただし、%-3/10は実際にはゼロではないため、実際の値は隠されています。fpprecで遊ぶ:50; 0.3は、まだ2進数で表すことができますが、0.3b0と入力すると、さらに多くの桁になります。

0.1 + 0.2-0.3b0; 4.440892098500626161694526672363281263363823550461b-17を与える

Maximaがfloatを有理数に変換することについてのメッセージが気になる場合は、ratprint:falseを設定してください。コンピューティングは変更されず、警告のみが変更されます。

于 2011-07-28T00:04:43.987 に答える