- ベストアンサー
単精度実数の範囲を求める方法を教えて下さい
ご教授願います。 単精度実数では1ビットの符号部、7ビットの指数部、24ビットの仮数部で表し、-3.40282×10^38~3.40282×10^38の範囲を表すとあります。この、-3.40282×10^38~3.40282×10^38はどのように計算すると求められるのでしょうか? よろしくお願い致します。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
最大値の数字から判断して、IEEE754の単精度実数だろうと思いますのでその線で説明します。 まず、浮動小数点数が 仮数部×指数部で表されるというのはいいですよね? で、二進数でこれらの最大値を考えると、 1.111....1 (全部で24ビット分) が仮数部の最大値で、 指数部の最大値が 127 になるというのもいいですか? そうすると全体として 1.111...11(二進数) × 2^127 が最大の大きさになります。これを十進数に変換すると大体質問にあるような数字になります。 正確な手順は忘れてしまいましたが、とりあえず指数部に関しては 2^126 が十進数では何桁になるかを概算すると log10(2^127) → 127 × log10(2) → 127 × 0.301 → 38.22700 となりますのでまあ大体38桁前後(10^38) ですよ。ということです。 正確なところは数学カテゴリででも訊いてください(^^; 数値計算入門I~第2回~ http://zwo.phys.chs.nihon-u.ac.jp/Suchi12/1-2/1-2.html
その他の回答 (8)
- Tacosan
- ベストアンサー率23% (3656/15482)
大丈夫だろうけど「その形式だ」と勘違いされるとまずいな~と思ったんですが, 文章を読み切れず申し訳ありません>#8. しかし, 本当のところどんな形式なんだろ?
- sakusaker7
- ベストアンサー率62% (800/1280)
>ここで挙がっている形式とは異なります>#6. ごもっとも。 それを踏まえた上でこういった感じで求められますよという例を出したまでですので その辺ご賢察いただきたく :)
- Tacosan
- ベストアンサー率23% (3656/15482)
IEEE754 単精度実数は符号 1ビット, 指数部 8ビット (オフセット 127), 仮数部 23ビット (指数部が 0 と 255 以外では整数部の 1 を除く) なので, ここで挙がっている形式とは異なります>#6. もちろん「最大値」から IEEE754 単精度っぽいことは推測できるんですが, ビットの振り分け方が違う (特に仮数部が 24ビットということから「仮数部を 16進 6桁で表現し, 指数部は 16 のべき」という可能性すらある) ので「どういう表現なのか」と聞いてるわけです. ところで, その「モノの本」のタイトルなどは挙げられないんでしょうか? まあ挙がったとしても確認できるかどうかはわかりませんが.
- Tacosan
- ベストアンサー率23% (3656/15482)
「どんな値を意味するのか」はその「モノの本」に (数式付きで) 書いてあるような気がするんだけどなぁ. 書いてなかったとしても, 調べるために必要なものはそろってるはずだから検索すればわかるはずだよ. 浮動小数の表記法としては IEEE754 が標準だけど, これだと指数部は 8ビットなんだよなぁ. だから聞いたんだけど....
お礼
ご返信、ありがとうございます。 IEEE754とはビットの振分けが違うようです。 ネットで調べた限りでは2通りの表記方法があるようです。 範囲の結果の表記はあるのですが、計算過程を見つけるとはできませんでした。
- outerlimit
- ベストアンサー率26% (993/3718)
24ビットの仮数部を10進表記すれば 有効数値が求められます 7ビットの指数部で仮数部が表す値の範囲が求められます が 表記法によって純2進表記や4ビット正規化表記等がありますから 定義を確認しない限り、正解にはなりません
お礼
ご返信ありがとうございます。 モノの本での記載が上記の通りでしたので…。知識不足で申し訳ありません。
- Tacosan
- ベストアンサー率23% (3656/15482)
ビットパターンと「それが表している数値」の関係を教えてください. それがないと, 答えようがありません.
お礼
ご返信ありがとうございます。 モノの本での記載が上記の通りでしたので…。知識で不足申し訳ありません。
- himajin100000
- ベストアンサー率54% (1660/3060)
>System.Math.Pow(2,-(8-1))(こちらは絶対値の最大最小を求めるのには使わない) 間違い。 - System.Math.Pow(2,(8-1)) が多分正しい
お礼
ご返信ありがとうございます。 せっかくご解答を頂いたのですが、当方のプログラムに関する知識が乏しい為、内容を理解することができませんでした。 申し訳ありませんが、数式での解法を記載して頂けると助かります。
- himajin100000
- ベストアンサー率54% (1660/3060)
/* C# 多分計算としてはこんな感じ。 Wikipedia見ると,単精度浮動小数点数は http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0#IEEE.E6.96.B9.E5.BC.8F.EF.BC.88IEEE_754_.E5.BD.A2.E5.BC.8F.EF.BC.89 符号部1ビット・指数部8ビット・仮数部23ビット って書いてあるんだけど? 仮数部はその仕様上,最大で2未満にしかならない(正確には2 - System.Math.Pow(2,-23)) 面倒くさいので2でいいや。 指数部は正と負の数を考えなきゃいけないから 8ビットだと 最大で System.Math.Pow(2,(8-1)) - 1 最小で System.Math.Pow(2,-(8-1))(こちらは絶対値の最大最小を求めるのには使わない) 小さいほうが1大きいのは http://www.algolab.co.jp/~lum/pcnyumon/nyu032.htm あたりを参考のこと 符号部ももちろん、絶対値の最大最小を求めるのには使わない よって 考えられる最大値は = System.Math.Pow(2,System.Math.Pow(2,7) - 1) * 2 見づらいから10を底として対数とって見よう・・・(以下コード見ればわかるので省略) */ namespace Q3912041A { class Program { public static void Main(string[] args) { double a = System.Math.Pow(2,System.Math.Pow(2,7) - 1) * 2; //最大桁数 System.Console.WriteLine(System.Math.Floor(System.Math.Log(a,10))); // 38 System.Console.WriteLine(a / System.Math.Pow(10,38)); // 3.40282366920938 System.Console.ReadKey(true); } } }
お礼
ご返信、ありがとうございます。 詳しくご記載頂き、とても参考になりました。 ありがとうございました。