質問

私のコースでは、私は聞いています:

  

連続値をメモリに約表され、したがって、フロートで計算すること丸め誤差を含むされます。これらは、ビットパターンにおける小さな相違しています。 e==feがフロートしている場合、したがって試験fは危険である。

のJavaを参照します。

これは本当ですか?私はdoublesとfloatsとの比較ステートメントを使用しましたし、丸めの問題を持っていたことがありません。私は教科書に似た何かを読んだことはありません。確かに仮想マシンアカウントこのため?

役に立ちましたか?

解決

これは本当です。

これはどのように浮動小数点値の固有の限界は、ビットの有限数のメモリ内に表されている。

"偽"

このプログラムは、例えば、プリントます:

public class Main {
  public static void main(String[] args) {
    double a = 0.7;
    double b = 0.9;
    double x = a + 0.1;
    double y = b - 0.1;
    System.out.println(x == y);
  }
}

の代わりに「==」との正確な比較で、あなたは通常、精度のいくつかのレベルを決定し、数字が「十分近い」である場合に尋ねます:

System.out.println(Math.abs(x - y) < 0.0001);

他のヒント

これは、同じくらいの浮動小数点を使用して、他の言語にJavaのように適用されます。これは、ハードウェアでの浮動小数点値の表現の設計に固有です。

浮動小数点値に関する詳細情報:

すべてのコンピュータ科学者は、<浮動小数点演算について知っておくべきこと/>

はい、ベース2に正確に0.1を表現する正確ベース10に1/3を表現しようと同じである

これは常に真です。フロート小数点表現を使用して正確に表現することができないいくつかの数字があります。例えば、パイを考えてみましょう。どのようにして有限の記憶装置内に、無限の数字を持っている数を表しているのでしょうか?数値を比較する際に、それらの間の差は、いくつかのイプシロン、その後も小さい場合したがって、あなたは確認する必要があります。また、それはあなたがそのようなBigDecimalのとのBigIntegerとして、より高い精度を達成するのを助けることができますが存在し、いくつかのクラスがあります。

これは正しいです。 Javaはそれとは何の関係もない、問題は、のANY の言語ます。

で浮動小数点演算に固有のものであることに注意してください

あなたは、多くの場合、教室レベルの問題でそれを離れて得ることができますが、現実の世界で仕事に行くのではありません。時にはそれは、教室では動作しません。

昔に戻って、学校での事件。優れた学生の多くは、実際のdoozyを証明した最終試験の問題を割り当てたイントロクラスの教師 - それは働いていなかったと、彼らは理由を知りませんでした。 (私は研究室の助手としてこれを見て、私はクラスではありませんでした)最後に、いくつかの助けを私を求め始め、いくつかは、プロービングの問題を明らかにした:彼らは、浮動小数点演算の固有の不正確さについて教えたことがなかった。

さて、この問題には2つの基本的なアプローチがあった、と別のエラーを作成し、動作しないでしょう、よりエレガントなもの((それは同じエラーが毎回作ったとして偶然この場合で働いていた)ブルートフォース1。任意のアイデア理由がなくても、レンガの壁にぶつかるだろう優雅なアプローチを試してみました)誰も。私はそれらの束を助け、理由を説明するコメントで立ち往生し、彼は疑問を持っていたなら、私に連絡します。

:私はこのことについて彼から聞くと、私は基本的にシンプルな小さなプログラムで部門全体を床の

コースの次の学期

10 X = 3000000
20 X = X + 1
30 If X < X + 1 goto 20
40 Print "X = X + 1"

部門内のすべての教師が考えたものにもかかわらず、これはは終了します。 300万種子は、それがより速く終了させるために、単純です。 (あなたが基本的なわからない場合:何の仕掛けは、単に浮動小数点数の精度を排出、ここにはありません。)

はい、Javaはまた、浮動小数点の算術演算を使用します。

もちろん、それは本当です。それについて考えてみよう。任意の数のバイナリで表現されている必要があります。

写真:0.5or 1/2として "1000"、つまり、2 ** -1。そして、 "0100" 0.25または1/4です。私は行くよどこで見ることができます。

この方法でどのように多くの数字を表すことができますか? 2 ** 4。多くのビットを追加すると、利用可能なスペースを複製し、それは決して無限です。問題1 / nの1/3または1/10、2の任意の数のない複数が実際に表現することができない。

1/3 "0101"(0.3125)または "0110"(0.375)であり得ます。どちらの値あなたは3を掛けた場合、あなたは特別なルールを追加することができます。もちろん、1ではありません。あなたが言う、このアプローチは、長期的には動作しません...「あなたは3回 『0101』を追加したとき、それは1にします」。あなたは、いくつかをキャッチすることができますが、その後方法については1/6回2?

これは、彼らはすべての後に無限で、任意の有限表現は、あなたが表現できない番号があり、バイナリ表現の問題ではない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top