• ベストアンサー

浮動小数点演算と固定小数点演算の使い分けについて

解説書などには、「浮動小数点は3.14E0の形」や「固定小数点は3.14」などと説明されています。 では、例えば、ごく一般的な32ビットマシンで「3.14 * 45.6」という命令を書いたときに演算されるのは浮動小数点演算なのか、固定小数点演算なのかがわかりません。例えばIntelのx86CPUは、内部にFPUを持っているそうですが、この場合は「3.14 * 45.6」は、内部では必ず浮動小数点演算になっているということなのでしょうか? 「3.14 * 45.6」を「3.14E0 * 4.56E1」と書いた場合にしか浮動小数点演算されないということではないと思っているのですが、実際の浮動小数点演算と固定小数点演算の内部的な切り替えがわかりません。 理解が足りなくて、おかしな質問になっていましたら、その点もご指摘いただければうれしいです。

  • aneja
  • お礼率93% (379/405)

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

  • ベストアンサー
  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.1

コンピュータで固定小数点演算というのは、整数のことです。 表現的には「3.14」を固定小数点と言っても、コンピュータ の演算は、整数と浮動小数点しかありません。 整数は、小数点の位置が一番左と捉えられますので、固定小 数点です。 3.14*45.6はコンパイラは必ず浮動小数点演算を行います。 314*456/1000などとはしない訳です。 例えばC言語の型は何がありますか? 数はintやfloatであとはそれらの精度の違いしかありま せん。整数と浮動小数点しか無い、ということです。 CPUの命令を調べれは分かりますが、小数演算で、固定小 数点演算という命令は存在しません。 整数演算を固定小数点演算ということはあります。 あくまでも、表記方法が45.6が固定小数点表記で、 4.56E1の場合、浮動小数点表記ということですね。

aneja
質問者

お礼

早速のご回答、どうもありがとうございました。 整数と浮動小数点しか無い、というご説明は、すっきりとして理解しやすかったです。参考書によく書いてあるのは、表記としての表現なのですね。ありがとうございました。

その他の回答 (4)

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

DSP や組み込み系では固定小数での演算も考えられますが, 「ごく一般的な 32ビットマシン」で何も考えずに書いたら, 普通は浮動小数点演算になります. Java は浮動小数しかないので確定. C でも普通に考えれば浮動小数です (規格は未確認だけど固定小数であらわしているとは考えにくい). なお, 本当にハードウェアのレベルまで落ちてしまうと, そこには「ビット」しかありません. そこからいろいろと配線をして「整数演算」をやったり「浮動小数演算」をやったりします. だから, (遅くなることを無視すれば) 整数演算だけで浮動小数演算をシミュレート可能です. たしかに 387 なしは遅かった.... 蛇足かつ #4 は知ってると思うけど 80487SX は厳密には「FPU」ではない.

aneja
質問者

お礼

ご回答、どうもありがとうございました。 言語ごとの特徴も教えて下さって、ありがとうございます。ハードウェアのことも勉強したいと思います。

  • kent85
  • ベストアンサー率52% (38/73)
回答No.4

例えば、足し算のみ、小数点以下2桁が有効 上下限値は、0.50 ~ 100.90 データ数が、10個 それの合計値を出してください、であれば データを100倍して物事を考えて整数演算(十進数?)させるというのも一つの手です。 0.50 -->> 50 1.25 -->> 125 100.90 -->> 10090 50 + 125 + 10090 -->> (電卓演算につき省略…) -->> 結果の変数 X Xを 1/100 すれば本来の結果が出ます。 ただし、Xを文字列にしておいておけば、小数点の「ピリオド」を 挿入すれば済むので、浮動小数点演算ユニット・命令は使いません。 元の入力数値も浮動小数点な文字列なら、命令を使わずに完了しますよね。 -- FPUレジスタと、汎用整数レジスタのEAX/EBX…は違います。 FPUをわざと使わない…で整数レジスタだけの演算も可能なんです。 ないから…使えなかった時代にも浮動小数点演算は可能でした。遅かったなぁ。 ふっるーい 80287 / 80387 / 80487は、一応外付けのFPUです。 NexGenのNx586も、FPU UNITを内蔵してなく専用のFPUがあったらしい??です。 整数レジスタだけを使っての演算は、いくつか手法があります。 演算ライブラリを使用するなどですが、高速化を考慮しないとダメです。 ですけど、明示的にFPUを使わせることは、可能です。(あれば) とあることをすれば、FPUレジスタ制御は可能です。 FPUレジスタを初期化 ~ 浮動小数点処理 ~ FPUの後処理 など。 もちろん最底辺である、べたべたのアセンブラ記述をすれば好きなように FPUレジスタを使ったプログラムは書けます。インラインアセンブラでも。 命令その他も整数演算のものとは、違うと気がつきます。 コーディングしたソフトが、FPU命令-浮動小数点演算をつかっているかは 言語によってはアセンブラ出力オプションで確かめられますし あるいはデバッガで、逆アセンブルすることでも観ることが可能でしょう。 80387あたりの命令マニュアルでも読めばわかります。 PCでなく、組み込みなんかの世界ではFPUがあるけど遅かったりするので 全部浮動小数点演算させるのではなく、細工して絞って演算させたりしてます。 mp3エンコーダの午後のこーだの、のろのろ部門に i486SX-33 (FPU無し)が二位でノミネートされています。。。素晴らしい。

参考URL:
http://homepage1.nifty.com/herumi/gogo_bench.html
aneja
質問者

お礼

早速のご回答、どうもありがとうございました。 恥ずかしながら、プロセッサ内部の知識はほとんどないので、ご回答の内容もまだまだ消化できていない部分がありますが、整数レジスタのみで浮動小数点演算と等価なことができるとは知りませんでした。 まだまだ勉強しなければいけないことが盛りだくさんです。 どうもありがとうございました。

  • notnot
  • ベストアンサー率47% (4845/10256)
回答No.3

多くの言語では、小数点を含んだ数字表記は、浮動小数点表記であれ固定小数点表記であれ、浮動小数点データになります。プログラム上の文字の字面と、データの種類はまた別です。浮動小数点データの演算は当然、浮動小数点演算です。 整数でない固定小数点データを扱える言語は、限られています。昔から主に大型コンピュータで使われているCOBOLやPL/Iでは固定小数点実数型があります。例えば、PL/Iで、"FIXED DEC(10,4)"と言う型は「固定小数点十進10桁、うち、小数点以下4桁という型」です。新しめの言語でも何かあったような気がしますが、ちょっと思い出せません。

aneja
質問者

お礼

早速のご回答、どうもありがとうございました。 おっしゃるとおり、浮動少数点データの演算は浮動小数点演算なのですね。見た目と内部のデータは別だということが少し理解できました。 どうもありがとうございました。

noname#130082
noname#130082
回答No.2

プログラム言語によって違いますので、言語の指定をした方が回答者も回答しやすいと思います。

aneja
質問者

補足

さっそくのご回答、どうもありがとうございました。プログラム言語によって違うとは思いもつかなかったので、説明が不足してしまいすみません。C++とjavaでは、どうでしょうか。

関連するQ&A

  • 浮動小数点演算とは

    浮動小数点演算とは何か調べたのですがイマイチよくわかりません。 簡単に言うとどういうことでしょうか?

  • スーパーπは、ALU(整数演算)か、FPU(浮動小数点演算)どちらの性

    スーパーπは、ALU(整数演算)か、FPU(浮動小数点演算)どちらの性能によってスコアが変わるのでしょうか? スーパーπについて調べると、「FPUの性能の比較対象になる」や「整数演算の比較対象になる」など両方の情報があります。 たしかに、L2キャッシュの大小でそこそこスコアが変わるので整数演算の可能性もあります。 しかし、SSSE3対応以前のCPUのスコアがあまり高くないので、浮動小数点演算の可能性もあります。 みなさんは、スーパーπがどちらの比較をしていると考えますか? スーパーπ http://www1.coralnet.or.jp/kusuto/PI/super_pi.html

  • 固定小数点と浮動小数点

    電算機の小数点認識に固定小数点と浮動小数点というのがあると聞きました。前者は分かるのですが、浮動小数点のWikiとかの記述を見てもあまりピンときませんでした。わかりやすい説明はないでしょうか。

  • 浮動小数点について

    当方、浮動小数点を勉強しているのですが、 テキストの解説を読んでも理解が出来ません。 正規化とか指数と仮数の意味が分かりません。 そこで質問なのですが、浮動小数点の計算方法を教えて下さい。 IEEE形式の浮動小数点も教えて頂けると助かります。 また、下記の問題について解説して下さい。 数値を16ビットの浮動小数点表示法で表現する。 形式は図に示す通りである。10進数0.375を正規化した表現は、どれか。 ここでの正規化は、仮数部の有効数字よりも上位の0が無くなるように、 指数部を調節する操作である。 (図は添付します) 何故「E」の値が「1111」になるのでしょうか。 お手数ですが、ご教授お願いします。 尚、特に分かり易いホームページがあったら、 そのURLを記載して頂いても結構です。 以上、よろしくお願い致します。

  • 浮動小数点演算FLOPSについて

    コンピュータの勉強はじめたのですが 浮動小数点演算とは どのようなことをさすのでしょうか。

  • 浮動小数点について

    32ビットの浮動小数点(符号1ビット指数8ビット仮数23ビット)で最小値を求めるにはどういう計算をすればいいのでしょうか?また調べた数値だと最小値 1.175494351E-38 最大値3.402823466E+38のところ±3.40282347E+38 ~ ±1.40239846E-45のところがあるのですがどちらが正しいのでしょうか?

  • AthronX2 5200とCore2DuoE6600で浮動小数点の演算が速いのはどっち?

    AthronX2 5200とCore2DuoE6600で浮動小数点の演算が速いのはどちらなのでしょうか?ベンチマークでいろいろ異なる結果が出て困っています。HD BENCHではCore2DuoE6600がAthronx2 4200に負けてしまいました。CUBASE(DAW)を使用しているので浮動小数点演算が速くないと困るのです。本当にAthronX2 5200とCore2DuoE6600で浮動小数点の演算が速いのはどちらなのでしょうか?Core2DUOの浮動小数点演算の能力が低ければ買い替えを検討しています。多角的な側面からアドバイス願います。

  • 安価に、高速な浮動小数点演算をするためのハードウェアについて

    安価に、高速な浮動小数点演算をするためには、どんなハードウェアがあるでしょうか、またはこれらの情報をまとめているサイトなどがありましたら、教えていただけないでしょうか。 具体的には、現在入手できる浮動小数点演算の得意なICの一覧などが得られるとうれしいです。 現在のところ、計算対象を限っていませんが、最終的な目標として行列計算などが高速に出来たらと考えています。

  • 浮動小数点表示と固定小数点表示

    固定小数点0.00128を浮動小数点表示すると0.128×10^-2と学校で習ったのですが、1.28×10^-1や128×10^-5としてはいけないのでしょうかどなたか教えてください。

  • 浮動小数点

    浮動小数点について勉強していますが、本を見てもよくわかりません。 「イクセス表記とは、本来8ビットで表現できる値は0~255であるのに対し、元の値に127を加算することにより、-127~128までの表現を可能としています。つまり、Eが0の場合は-127を、Eが127の場合は0を、Eがすべて1の場合は128を示しています。」(日経BP社) とありましたが、 ●127を加算したら、なぜ-127~128か?このマイナスはどうしてでてくるのか? 何か、例をあげて教えてもらえればうれしいです。 よろしくお願いします。