• ベストアンサー

データ型 double の桁数について

picマイコンをPICC liteと言うCコンパイラで作成しているのですが、そのPICC liteでは、データ型のdoubleは24ビットで、-3.4×10の38乗 ~ 3.4×10の38乗となっているのですが・・・この意味がさっぱりわからず何桁まで扱えるのかわかりません。 小数点以下は何桁? 整数部分は何桁? ・・・整数 小数含めて何桁まで大丈夫なのでしょうか?

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

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

doubleは浮動小数点型で、浮動小数点型は大きな値から小さな値までを扱えるように考え出された科学技術計算用のデータ形式で有効桁を犠牲にして扱える値の範囲を宇宙の広さから原子の大きさまで幅広く扱えるようにしています。 >小数点以下は何桁? 整数部分は何桁? と言うような精度では表せません。 http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9 http://www.cc.kyoto-su.ac.jp/~yamada/pB/float.html 仮数部が15ビットだと精度は2進→10進変換が入るので10進で4.8桁程度です。実用レベルで有効桁は4桁ぐらいですかね。小数点の位置は関係ないです。 例えば、1.0012だとしたら1.001xで最後の2は信用できないです。10012だとしても1001xで最後の2は信用できないです。わかりますかね? 有効桁を超えた計算も出来ません。100000+1は100000です。1は有効桁外ですから。 そ あと、PICの場合は浮動小数点演算回路を持っていないCPUですので固定小数点のint型の数百倍かそれ以上に計算速度が遅くなります。利用はお勧めできません。

jun_jii
質問者

お礼

詳しい説明ありがとうございました。ペコリ(o_ _)o)) ・・・思っていたより全然桁数は少ないのですね・・・(TOT) 勉強になりました。ありがとうございます。

jun_jii
質問者

補足

すいません一つ気になることを思いついたので教えてください。 doubleは4桁しか扱えない(正確でない)ということは、だったら同じ24ビットのunsigned short long型を使って計算(掛け算など)した方が扱える桁数も多いし、正確な数字も出るということでしょうか?

その他の回答 (3)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

>すいません一つ気になることを思いついたので教えてください。 >doubleは4桁しか扱えない(正確でない)ということは、だったら同じ24ビットのunsigned short long型を使って計算(掛け算など)した方が扱える桁数も多いし、正確な数字も出るということでしょうか? その通りです。 例えば金額計算でdoubleやfloatの浮動小数点型を使うプロのプログラマをいません。誤差があるので使い物に成りませんから。24ビットのunsigned short longの固定小数点型だと1677716で確実に10進で6桁まで扱えますからね。 じゃあ、浮動小数点型をどういうときに使うかというと1kmは原子で約何個分かと言う計算が固定小数点は値の範囲が広すぎて出来ませんが浮動小数点では可能です。

jun_jii
質問者

お礼

回答ありがとうございます。 なるほど!! そうだったのですか・・・小数計算だからとdoubleを使ってしまいました・・・σ(^◇^;)ヒヤアセ unsigned short longを使ってやろうと思います。ありがとうございました。ペコリ(o_ _)o))

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

まずは「浮動小数点数」とはどういうものか勉強してください。 浮動小数点数では、「仮数部」と「指数部」に分けて数値を表現します。 分かりやすく、10進数で説明すると、有効数字5桁の浮動小数点数では 0.012345を「1.2345×0.01」(=1.2345×10の-2乗) 123450を「1.2345×100000」(=1.2345×10の6乗) と表現します。1.0000~9.9999の範囲の「仮数部」と、それからを何桁ずらすのかを意味する「指数部」の組み合わせです。 123456(1.23456×10の6乗)や0.123456(1.23456×10の-1乗)といった数値はこれらの数値は仮数部が6桁ありますので、仮数部の有効数字が5桁だと表現できません。 でも、有効数字が5桁までなら、非常に大きな数値も小さな数値も、扱うことができます。 1234500000000 は、1.2345×10の12乗だし、 0.00000012345は、1.2345×10の-7乗です。 ですから、浮動小数点数では「小数点以下何桁」「整数部分は何桁」といった概念はありません。扱える数字の範囲は「上から数えて何桁」って 形になります。 以上、10進数で説明しましたが、2進数でも原理は同じです。 で、PICC lite のマニュアルによると、24bit double は仮数部15+1ビット、指数部8ビットとなってます。 2進数で16bitの精度がありますから、10進数で考えるなら「有効数字は約5桁」です。 0.012345や、12345000 は扱えますが、12345600 や 0.0123456 を扱うには精度が足りないことになります。

jun_jii
質問者

お礼

詳しい説明ありがとうございました。ペコリ(o_ _)o)) なるほど そういうことだったのですか・・・素人には難しいですねσ(^◇^;)ヒヤアセ 完ぺきではないと思いますが、ある程度理解できました。 ありがとうございました。

jun_jii
質問者

補足

すいません一つ気になることを思いついたので教えてください。 PICC liteでdoubleは約5桁しか扱えない(正確でない)ということは、だったら同じ24ビットのunsigned short long型を使って計算(掛け算など)した方が扱える桁数も多いし、正確な数字も出るということでしょうか?

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

>3.4×10の38乗 ってことは、指数部が8ビットっぽいから、符号1ビット仮数部15ビット(ケチ表現抜き)じゃないかと。 HITEC Cのマニュアル持ってないからあってずっぽうですが。

jun_jii
質問者

お礼

ありがとうございました。ペコリ(o_ _)o))

関連するQ&A

  • 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桁しかないという事なのでしょうか? 何かお分かりの方がいらっしゃれば、是非アドバイスを頂きたいと思います。 では、よろしくお願い致します。

  • エクセルVBA データ型 SingleとDouble

    SingleとDoubleともに、整数部分の範囲についてはどのように 考えればよいのでしょうか?例えば、小数点以下4桁までを正確 に計算できれば良く、変数の値が 54321.**** となる場合は Singleで良いのでしょうか? SingleとDoubleで対応できる、整数部分の範囲を教えてください。 お手数ですが、よろしくお願いします。

  • 有効桁数について

    たとえば整数の3桁割る4桁の場合の数値についてです。 レポートの表に数値を記入するとき,たとえば0.921,0.866,0.995,1.331と計算結果が続くとき 小数点以下の桁数を同じにしてはダメですか? やはり1.331は1.33と記入しないとダメなのでしょうか?私は小数点以下の桁数をそろえて記入したところその理由を問われたのですが,答えられませんでした.小数点以下の桁数をそをえてもいい時のわけを教えてください.   大変困ってます!!!

  • 小数点の桁数ってなんて言いましたっけ?

    0.001 という数値から小数点3桁の3を算出したいんですが、この3の事をなんて言いましたっけ? 10のマイナス3乗?指数?Log10? またC#でこの値を簡単に出す関数なんてありましたでしょうか?

  • エクセルで数値の桁数を一定の法則で統一したい

    E列にA~D列のデータから計算された数値が並んでいます。 たとえば E1:9.9 E2:86.08695652 E3:212.8571429 E4:1158.13953488372 これらを E1:9.90 (整数1桁の場合は四捨五入して小数2桁まで)       1未満の数値も小数2桁で(例、0.96) E2:86.1 (整数2桁の場合は四捨五入して小数1桁まで) E3:213  (整数3桁の場合は四捨五入して小数カット) E4:1158 (整数4桁の場合は四捨五入して小数カット) 上記の法則で見やすく整理したいのです。 整数4桁が最大です。大量のデータをまとめて整理出来る方法は ないでしょうか?よろしくお願いします。

  • float double の範囲

    javaのサイト見てます データ型にfloat doubleというのがあるのですが、 範囲が float 3.40282347E+38 double 1.79769313486231570E+388 と記載されているのですが これはどうゆう意味でしょうか? 小数点38桁388桁までという意味でしょうか?

  • C++ での開発環境が安価に入手できるマイコンはありますか?

    C++ での開発環境(コンパイラ)が安価に入手できるマイコンはありますか? PIC には、C のコンパイラしかないみたいで、他のマイコンは、あまり知らないのです。 よろしくお願いします。

  • phpで小数点型をfloatとdouble型といい

    phpで小数点型をfloatとdouble型といいますが なぜ小数点型をfloatと呼ぶんでしょうか? 整数は英語でintegerですが、小数はdicimalですよね

    • ベストアンサー
    • PHP
  • Single→Long変換(ビット配列での変換)

    WindowsXP、Visual Basic 6.0(SP6)にて プログラムを作成しております。 やりたいことは、浮動小数点で格納されたSingle型32bitのビット列を、 そのまま整数値に同じビット列として変換したい、ということです。 例えば、12.75であれば、Single浮動小数点の内部形式(IEEE)は 0x414C0000になりますが、この値をそのまま整数値(Long)に変換できればと 考えています。 外部機器(PLC等)と浮動小数点データのやりとりを行う必要があり、 PLCへは単なる16ビットのデータ(0~65535)を整数値として転送するしか ない状況で、上記のような問題に直面しております。 何かアドバイスを頂けますと幸いです。

  • PIC用のCコンパーラーの組み込み

    現在、PICマイコン用Cコンパイラー(デバッカー付き)をインストールしました。しかしながら、ふつうに使用すると、プロンプト画面からいちいちコマンド入力しなければいけないため、統合開発環境であるマイクロチップ社のMPLAB-IDEにCコンパイラ(デバッカ付き)を組み込もう としているのですが、説明書にそれらしいものが見あたりません。誰か、組み込み方を知っている人、教えて下さい。ちなみに、PICのCコンパイラは、(有)データダイナミクスの、PIC Cコンパイラ バージョン3、です