C++でのdouble型データの精度について

このQ&Aのポイント
  • C++のdouble型データの精度について調査しました。コンパイラによって異なる可能性もありますが、一般的には16桁の精度があります。
  • しかし、実際には11桁という結果が得られることもあります。これはコンパイラの仕様や計算方法によるもので、注意が必要です。
  • もし正確な値の保持が必要な場合は、他のデータ型や方法を検討することをおすすめします。
回答を見る
  • ベストアンサー

C++でのdouble型データの精度

こんにちは。 コンパイラは、Borland C++ Compiler 5.5 を使っています。 表題の「精度」とは、 正確な値が保証される、「整数部分の桁数」+「小数点以下の桁数」 の事です。 普通、double型データの「精度」は、16桁であると認識しています。 そのため、例えば、 a=123456789012345.6 という浮動小数点数は16桁なので、正しい値が保証されるはずです。 ところが、printf("%f", d1); のようにprintf関数で表示すると、 123456789012345.593800 と表示されました。 これは、d1が正しい値を保持できていないという事です そこで、桁数を下げていった所、 a=1234567890.1 つまり、精度は11桁しかないという事になります。 何か僕が勘違いしているのでしょうか? それとも、僕が使っているコンパイラの精度が11桁しかないという事なのでしょうか? 何かお分かりの方がいらっしゃれば、是非アドバイスを頂きたいと思います。 では、よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.2

真の値との誤差は (123456789012345.6-123456789012345.593800)/123456789012345.6 = 約5×10^-17 なので、10進数16桁程度の精度は十分ありますよ。

MetalLover
質問者

お礼

御回答ありがとうございます。 すみません、僕の勘違いでした。 printf("%.1f", d); で、小数点以下の精度を1桁にするか、 cout<<setprecision(16); で、coutストリームの精度を16桁に指定すると上手く行きました

その他の回答 (1)

  • co2ro
  • ベストアンサー率30% (154/499)
回答No.1

あなたが、何処で仕入れた知識か分かりませんが、先ず、あなたが言う『精度』の概念が間違っています。(『単精度』と『倍精度』と云う言葉を知っていますか?) 長文を書くのは苦手なので、『単精度』、『倍精度』で検索するか一応wikiのURLを張り付けるのでそちらを参照してください。

参考URL:
http://ja.wikipedia.org/wiki/%E5%80%8D%E7%B2%BE%E5%BA%A6

関連するQ&A

  • Accessクエリの整数型と単精度型の演算について

    Accessのクエリで長整数型と単精度浮動小数点型を 加算すると答えが一致しません。理由を知っている人いますか? ちなみに長整数型と倍精度浮動小数点型を加算したときは答えが一致します。 浮動小数点は誤差がつきものなのは分かりますが、 確か単精度浮動小数点型は有効桁数7桁までのはず。 下記の例では問題ないように見えます。 (例)長整数型と単精度浮動小数型の演算:1000+0.20=1000.20000000298 長整数型と倍精度浮動小数型の演算:1000+0.20=1000.2 それではよろしくお願いします。

  • データ型について

    VBに限ったことではないのですが、 データ型には、短整数型、整数型、長整数型、単精度浮動小数点数型、倍精度浮動小数点数型といろいろな型がありますが、 整数を扱うなら長整数型、小数も含めて扱うなら倍精度浮動小数点数型 を使えば良いと思うのですが、それにより桁数の小さな短整数型、整数型とかは何のためにあるのでしょうか? あまり大きな値を扱わないときにそちらの型を選ぶメリットは何なのでしょうか?

  • 浮動小数点数型

    単精度浮動小数点型と倍精度浮動小数点数型、それぞれ値がとりうる範囲を教えてください。 単精度浮動小数点型 負の値は -3.4028235E+38 ~ -1.401298E-45、 正の値は 1.401298E-45 ~ 3.4028235E+38 の範囲の値 倍精度浮動小数点数型 負の値は -1.79769313486231570E+308 ~ -4.94065645841246544E-324、 正の値は 4.94065645841246544E-324 ~ 1.79769313486231570E+308 の範囲の値 とは記述してあるのですが、実際に小数1桁なら整数部はどのくらいの範囲の値がとれるのか、皆目わかりません。 どうか、わかりやすく教えてください。 よろしくお願い致します。

  • Access2003にてあるフィールドのデータ型を

    Access2003にてあるフィールドのデータ型を 『数値型:単精度浮動小数点型』にして書式を『固定(0.00)』 にしてデータ格納しているのですがExcelVBAでSQL(SELECT文)を使って抽出すると すごい桁数(小数点以下)で出てきます どのようにすれば小数点以下2桁でデータ取得できますか?

  • c言語の変数の型について

    浮動小数点数の変数の型ってfloat、double、long doubleがありますよね?(その他もあったら教えてください) doubleはfloatの倍精度らしいですが、倍精度ってのは扱える数字の範囲が2倍なのか有効桁が2倍なのかわからないんで教えてほしいです。ちなみに、doubleとlong doubleの違いも判りません。 あと、これらの変数はprintfで出力するときは最高で8桁までしか出力できないんでしょうか?20桁とかは無理なんですかね?

  • 浮動小数点数の内部表現について教えてください

    float型の内部表現を表示するプログラムを書いていくつか試してみたのですが、どこからどこまでが仮数部でどこからどこまでが指数部なのか良くわかりません。 曲がりなりにも自分で考えた結果は次のとおりです。 10進表示: 内部表現 ;2進の指数表現 2 :01000000000000000000000000000000;10.0*10^0 4 :01000000100000000000000000000000;10.0*10^1 8 :01000001000000000000000000000000;10.0*10^10 16:01000001100000000000000000000000;10.0*10^11 32:01000010000000000000000000000000;10.0*10^100 また、 1 :00111111100000000000000000000000;0.1111111*10^0 0.5 :00111111000000000000000000000000;0.0111111*10^0 0.25:00111110100000000000000000000000;? 0.125:00111110000000000000000000000000;? 0.0625:00111101100000000000000000000000;? となりました。最上位ビットが符号だということは分かります。 質問をまとめると、 (1) 10進で 0.5 の2進指数表現は 0.0111111*10^0 ということなのでしょうか。もしそれで正解なら、どうして 0.1*10^0 としないでわざわざ丸め誤差を含む無限小数で表すのでしょうか。 (2) 仮数部と指数部のビットは決められていなくて、例えば状況によって仮数部のビットが少なくなり指数部のビットが多くなったりするのでしょうか。 (3)仮数部での小数点はどこにあるのでしょうか。 (4)float 型の小数精度は最小6桁ということですが、これは10進で6桁なのか2進で6桁なのか教えてください。 どれか一つでも教えていただけると助かります。 使ったコンパイラは Borland C++ Compiler 5.5 です。 }

  • VBAのsingle,doubleのデータ型のE+,E-

    VBAのデータ型longやsingleの E+やE-は何を表しているのでしょうか? 単精度浮動小数点型 3.4028235E+38~などです。 また、single doubleはそれぞれ-3.4028~、-1.797~ などと書いてありますが、1万台で小数点以下の数値がある値、たとえば17,562.256はどのデータ型を使えばよいのでしょうか?

  • Accessのデータ型について質問です。

    Accessのデータ型について質問です。 Accessの数値型に 整数型と浮動小数点がありますが、 (1)整数型のフィールドプロパティに「小数点以下表示桁数」の項目があるのでしょうか? (2)浮動小数点表示桁数を「自動」と「桁数指定」するのとでは、データサイズが変わるのでしょうか? どなたかご存じの方がおられましたら、ご教授よろしくお願いいたします。 m(_ _)m

  • ACCESSで小数点以下の表示を制限する

    こんにちは。 ACCESS2003を使っています。 フォーム上で、テーブルの特定の項目(単精度浮動小数点型)を、小数点以下2桁まで表示させています。 この項目は事前に小数点以下3桁目を四捨五入しています。 そしてテーブルの定義で少数点以下2桁まで表示させています。 確かにそのとおり表示されるのですが、そのテキストボックスにカーソルを位置付けると小数点以下10桁以上の小さな数字が表示されてしまいます。 1.これは誤差として避ける事ができないのでしょうか? 2. カーソルを位置づけた時、指定桁数以下を表示させないようにはできないでしょうか?

  • Accessのフィールドサイズに関する素朴な質問です。

    Accessのテーブルで、フィールドサイズに[単精度浮動少数型]を設定して、そのフィールドを使って、クエリで演算フィールドを作成します。 単純な引き算でも、びっくりするくらい小数点以下の桁が表示されるのですが、どうしてなのでしょう? [単精度浮動少数型]より[倍精度浮動少数型]を使用したほうがよいと聞きましたが、設定の桁数の違い以外に、理由があるのでしょうか? Access初心者にも理解できるよう、ご解答いただけますでしょうか。 WindwosXP,Access2002を使用しております。

専門家に質問してみよう