• ベストアンサー

浮動小数点数を10進表記するアルゴリズム

与えられた浮動小数点数から正確な10進表記の文字列を得るにはどうすればよいでしょうか。 主に、2進の指数を10進の指数に直す部分で悩んでいます。 単純に考えれば、2進数字の各桁について10進表記の数字列を求めて10進演算する方法が思いつきますが、大きな数や小さな数では計算量が極端に増えてしまいます。もっと効率的な方法はないものでしょうか。 logを取ればうまいこと計算量を減らせそうな気もしますが、正確さが犠牲になりそうです。

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

  • ベストアンサー
回答No.4

log() の使い方がわからなければ、log() を使う必要はありません。 回答にも書いたように、(無限精度の実数で無く)double なら、300回ちょっとのかけ算(or 割り算)なので、気にするほどの計算量ではありません。 それによく考えたら、log() を使って、指数部分を計算したにしても、仮数部分を正規化するのに、やっぱり、その回数だけ、かけたり割ったりが必要なので、実質的にはほとんど意味が無いですね。

SortaNerd
質問者

お礼

> 仮数部分を正規化するのに、やっぱり、その回数だけ、かけたり割ったりが必要 そうなのですか。結局のところ大量の乗算は必須なようですね。 納得しました。ありがとうございます。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

そういえば, そもそも最初の「与えられた浮動小数点数」というのはどんなフォーマットを想定しているんでしょうか? ぶっちゃけた話, IEEE754-2008 の decimalxx なフォーマットを使えば, こんなことで悩む必要すらなかったりしますが.

SortaNerd
質問者

お礼

それはあまり考えていませんでしたが、とりあえず2進のつもりではあります。 元々特に必要があっての質問ではなくただの知的好奇心からですので、すみませんがdecimalでは面白くないので不可とさせてください。

回答No.3

No.2 です。 No.2 のロジックだと、別に、最高のハードなど必要なく、浮動小数点演算ができる(ライブラリでも)機能があれば十分です。 また、このロジックだと、log() をとることによる誤差は本質的にありません。 演算時間も、log() を1回とるだけなので、全く問題になりません。 ロジックが理解できれば、こういう点での質問は出ないと思うのですが。 あと、確かに(少なくとも最初の)最適化は、仮数部分を 1未満 0.1以上ですね。

SortaNerd
質問者

お礼

はい、ですからロジックが理解できません。 logを使う場合のロジックを順を追って説明してもらえませんか。

回答No.2

log までとれるような環境なら、数値としての演算はできるのですよね? 1) 浮動小数点が、正数・負数・ゼロ のいずれかを判断して、(符号を覚えた上で)正数にする。 2) さらに、0 以上 1 未満になるように、10 をかけるか、10で割る(かけたり割ったりした回数は覚えておく) 3) 前項で、かけたり割ったりした回数が、10進数表記における、指数部分。 ここまでで、指数部分は完成。 double でも、たかだか、300回ちょっとで計算は終わる。 なお、log() (底が10) を使うと、2) と 3) の繰り返し計算がなくても、一発で、 指数部分が算出可能。 以下、仮数部分。 1) 仮数は、0 以上 1 未満に正規化されていると仮定する。 2) 10倍すると、(10進数表記で)小数点以下一桁の数値が、整数部分に出てくる。 3) 整数部分が、小数点以下一桁になる。 4) 整数部分を引く 5)それを10倍すると、本来の数字の小数点以下二桁目が整数部分にでてくる。 6) 以下、必要な精度だけそれを繰り返す。 ※もちろん、算出できた指数部分とか、仮数部分の桁は、ちゃんと文字に変換する。 おまけ。 http://www.nest4.net/tec/strnum.html (ただし、ここで説明しているルーチンは、変換結果を指数表示するようにはなっていません)

SortaNerd
質問者

お礼

回答ありがとうございます。 思えば環境はあまり具体的に考えていませんでした。考える上で必要なら、現在最高のハードウェアということでお願いします。 > 0 以上 1 未満になるように、10 をかけるか、10で割る なるほど、10進数の方で2の冪乗を計算することを考えていましたが、2進数に10を掛けた方が速そうですね。 ただ小数になると2進数は10で割れないので10進数で計算した方がよさそうです。 > log 必要な精度が得られるのか、および計算時間について詳しく分かりませんか? 仮数部分については流れがよく分かりました。 正規化は0.1以上1未満ですよね。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

一般に, a^n (n は整数) を計算するために必要な乗算はたかだか 2 log n 回くらい, ですよね. 「n のビット数の 2倍」くらいで「極端に増える」ということはないと思いますけど....

SortaNerd
質問者

お礼

回答ありがとうございます。 回数はlogNのオーダーでも、ビット数が増えるので1回あたりの計算量はもっと増えますね。 極端かどうかは、まあ感じ方の問題で。

関連するQ&A

  • 浮動小数点数の表現について

    浮動小数点数の表現で、このIEEEともう一つの方式の違いは何でしょうか? 参考書にこう載っていましたが、よく理解できませんでした。 違いを教えてください。 10進数の28をIEEE仕様の浮動小数点数で表示します。 仮数部を2進数に (28)10 → (11100)2 仮数部の正規化 (11100)2 ×2 0 →(1.1100)2 ×2 4 指数部をイクセス表記に2 4 → 2 131 10進数の28をもう一つの仕様の浮動小数点数で表示します。 仮数部を16進数に (28)10 → (1C)16 仮数部の正規化 (1C)16×16 0 → (0.1C)16 ×16 2

  • 32bitの浮動小数点数表現について悩んでいます

    情報処理の初心者です。 今、14070366(10)を数値データとしてとらえ、 32bitの浮動小数点数で表現するという問題について考えています。 14070366(10) =100111000001010000101110(2) 10進数を2進数に基数変換した部分、25桁が仮数部になるんですよね? 符号部は+なので0。 では指数部の7桁には何が入るのでしょうか? 以上が私の分かっていることですが、 最終的な解答を16進数で表記すると、 14070366はどうなるのでしょうか? お願いします。

  • excelで小数を浮動小数点数にする

    excelで長い桁の小数を浮動小数点数にする方法をおしえていただけますか?よろしくお願いします。

  • 16ビット浮動小数点数の表現方法について

    学校の課題において、ある数を2進数で表現し、さらにその数を16ビット浮動小数点数で表しなさい。またそのとき生じる誤差の名称を記しなさい、という課題がでており取り組んでいるのですが、ネットで調べていても計算方法が理解できず行き詰っております。どなたか計算方法の手助けをお願いできないでしょうか。 与えられた条件 符号ビット:1ビット(0:正、1:負) 指数部:4ビット 仮数部:11ビット 16ビット浮動小数点数で表す数 10011100011000011 です。計算方法を理解したいので、なるべく詳しくお願いいたします。 誤差の名称もできればご教授願います。

  • OSによる浮動小数点数の解釈と出力の仕組み

    現在主流となっているコンピューターのアーキテクチャにおいては、実数表現のために浮動小数点数という手法を用いていますが、浮動小数点数表現された2進数はただの2進数であり、たとえばWindowsのプログラムが浮動小数点数を10進表記で表示したりする際には、OSのどのあたりの機能が浮動小数点数を解釈して10進数表記にするのでしょうか?

  • 浮動小数点数型

    単精度浮動小数点型と倍精度浮動小数点数型、それぞれ値がとりうる範囲を教えてください。 単精度浮動小数点型 負の値は -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桁なら整数部はどのくらいの範囲の値がとれるのか、皆目わかりません。 どうか、わかりやすく教えてください。 よろしくお願い致します。

  • 固定小数点数、浮動小数点数について

    学校から課題が出ているのですがさっぱりなので教えていただければ幸いです。 課題:11051120 この数を32bitの固定小数点数、浮動小数点数であらわせ (1)固定小数点数、浮動小数点数とは何か (2)数値をあらわすための手順 この2点を教えてください。 1~10まで教えろとは言いません。ただ、やろうにも全くわからないので、ヒントだけでもいただけたらと思っています。 提出期限は10日までなので、よろしくお願いします。

  • 浮動小数表記方式

    こんにちわ すいません、よろしくお願い致します。 以下のIEEEが提唱する32ビット浮動小数点の表記形式を用いて、十進数の503.625を表記すると、どのようになるか。#IEEEの32it浮動小数点表記方式#符号部:1bit(0:正、1:負)指数部:8bit(2の乗数部分に127を加える ex.8乗→8+127=135=二進数で10000111)仮数部:23bit(仮数を二進小数で1.xxxxxとなるよう調整したxxxxxの部分)符号部、指数部、仮数部の順で左から詰め、仮数部の残りは0で埋める。それを16進数で表す。

  • β進n桁の浮動小数点

    2進3桁、ML(絶対値最大の浮動小数点数)=1 MU(絶対値最小の浮動小数点数)=2の浮動小数点数の 体系で表現できる数は全部でいくつか、すべて挙げよ。 また、計算機イプシロンを求めよ。 ・・・っという問題がわからなくて困っています。 どなたか、解法手順またはアドバイスをよろしくお願いします。

  • 浮動小数点数

    再質問で畏れ入ります。 数値を32ビット浮動小数点形式で表す。指数部は2を基数とし、負数は2の補数で表現する。10進数0.375をこの2を基数とした浮動小数点形式で正規化したものはどれか。ただし結果は16進数で表現する。 答え:7FC00000 という問題です。 まず0.375を2進数に 0.011 正規化 0.11 * 2^-1 指数部-1を2進数で求める -0000 0001 ->1111 1111 仮数部符号は正の数なので0 0111 1111 ???? ???? ???? ???? ???? ???? と・・・ ここの部分からわかりません・・・ (なぜか手持ちの参考書には省略してあり・・・) 7Fの部分はこれで間違いないでしょうか? またそのあとのC00000 はどうやって導くのか教えてください。 お願いいたします

専門家に質問してみよう