1

テイラー級数を使用して関数電卓を作成するプロジェクトがあります。さらに、ieee 754 標準浮動小数点システムの数値を分析しています。

私の電卓では、単精度または倍精度のどちらが必要かをユーザーが選択します。float 変数と double 変数を使用し、ieee 754 仕様に従って数値を分析します。

ユーザーが倍精度を希望する場合、分析は次のようになります。

double analyze=3.45
BigDecimal bd=new BigDecimal(analyze) 

それは私に与えます

3.45000000000000017763568394002504646778106689453125
  1. この数値は、PC メモリにバイナリ形式で格納されている実際の数値ですか?

  2. そうでない場合、格納されている数値の実際の値を取得する方法はありますか?

  3. また、なぜこれが起こるのですか?

    double analyze=0.5
    BigDecimal db=new BigBecimal(analyze)

印刷のみ0.5- 有効数字が失われるのはなぜですか?

なぜこれが起こるのか誰か教えてもらえますか

        BigDecimal one=new BigDecimal(0.1);
        BigDecimal five=one.multiply(new BigDecimal(5)) ;
        System.out.println("5 times 0.1 is "+" "+ five);

        System.out.println("But the 0.5 in BigDecimal is " + " "+ new BigDecimal(0.5));

これを実行すると、5 倍になります。

4

4 に答える 4

3
  1. はい、3.4500000000000017763568394002504646778106689453125 は、数値「3.45」を一般的な double 形式に変換したときに double に格納される実際の値です。

  2. それが本当の価値です。

  3. 0.5 を印刷する方法を示していません。私が思い出したように、Java の一般的な表示メカニズムの 1 つは、可能な場合、値を正確に表すために必要な数の数字を出力するだけです。末尾のゼロは冗長であるため、出力しません。

「まあ、.5 しか印刷されていない場合、数字が .5000000001 などではなく、.5000000000 であることをどのように知ることができるでしょうか?」と疑問に思うかもしれません。答えは、数値が .5 以外の場合、表示メカニズムがそのように定義されているため、より多くの桁が出力されるということです。したがって、「.5」は .5 を意味し、それ以上でもそれ以下でもありません。

これが学校のプロジェクトである場合、3.45 がわずかに異なる値で表されることを心配する必要はおそらくないでしょう。double にある値を使用して計算してください。

また、テイラー級数は、ある点の近くでは正確になるように設計されているため、実際の電卓には適していませんが、ある区間では正確な級数が必要になります。正確な結果を得るために必要な項数がはるかに少なくなるように、誤差をより適切に分散させる系列が他にもあります。学校のプロジェクトの一部として提案された場合にのみ、テイラー シリーズを使用します。

于 2012-12-17T21:51:54.017 に答える
3

1. お聞きしたいのですが、この数値は PC メモリにバイナリ形式で格納されている実際の数値ですか??

はい。

2.そうでない場合は、格納されている数値の実際の値を取得できます

そうですね、問題ありません。

  1. それは私だけを印刷します --> 0.5 なぜ有効数字が失われるのですか?

あなたはそうしない; 0.5バイナリ形式で格納されている正確な数値です。

于 2012-12-17T20:51:03.347 に答える
1
  1. はい。BigDecimal(double)コンストラクターは、「double を、double の 2 進浮動小数点値の正確な 10 進数表現である BigDecimal に変換します。」BigDecimal toStringメソッドは、正確な値を表示します。

  2. なし

  3. 0.5 は double として正確に表現できます。BigDecimal(0.5) の結果には、スケーリングされていない値 5 とスケール 1 があります。これは、指数なしで表示するための BigDecimal toString条件を満たしています。小数点以下の桁数は位取り 1 と同じです。

あなたのコード例:

    BigDecimal one=new BigDecimal(0.1);
    BigDecimal five=one.multiply(new BigDecimal(5)) ;

double 表現を調べていない限り、BigDecimal double コンストラクターを使用すると問題が発生します。0.1 は double として正確に表現できないため、正確であっても、「1」は正確に 0.1 ではありませんBigDecimal("0.1")

より一般的には、double の正確な値は常に形式を持ち、a/(2**b)ab整数であり、"**"べき乗を表します。(a * 5**b)/(10**b)同じ値を持ち、スケール b の BigDecimal として正確に表現できます。

于 2012-12-18T01:13:17.627 に答える
-2

一般に、float と double は10 進数を正確に表すわけではありません (2 の累乗と他のいくつかの「スイート スポット」を除く)。数値は内部的に 2 進数で保管されます。Double.doubleToRawLongBitsまたはで内部表現にアクセスできますFloat.floatToRawIntBits

于 2012-12-17T20:57:34.100 に答える