みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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

投稿日時 - 2009-02-22 09:25:06

QNo.4738690

すぐに回答ほしいです

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

コンピュータで固定小数点演算というのは、整数のことです。

表現的には「3.14」を固定小数点と言っても、コンピュータ
の演算は、整数と浮動小数点しかありません。
整数は、小数点の位置が一番左と捉えられますので、固定小
数点です。

3.14*45.6はコンパイラは必ず浮動小数点演算を行います。
314*456/1000などとはしない訳です。

例えばC言語の型は何がありますか?
数はintやfloatであとはそれらの精度の違いしかありま
せん。整数と浮動小数点しか無い、ということです。
CPUの命令を調べれは分かりますが、小数演算で、固定小
数点演算という命令は存在しません。
整数演算を固定小数点演算ということはあります。

あくまでも、表記方法が45.6が固定小数点表記で、
4.56E1の場合、浮動小数点表記ということですね。

投稿日時 - 2009-02-22 09:52:34

お礼

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

投稿日時 - 2009-02-23 00:10:17

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

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

投稿日時 - 2009-02-23 17:54:05

お礼

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

投稿日時 - 2009-02-24 00:31:12

ANo.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

投稿日時 - 2009-02-22 15:45:50

お礼

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

投稿日時 - 2009-02-23 00:23:27

ANo.3

多くの言語では、小数点を含んだ数字表記は、浮動小数点表記であれ固定小数点表記であれ、浮動小数点データになります。プログラム上の文字の字面と、データの種類はまた別です。浮動小数点データの演算は当然、浮動小数点演算です。

整数でない固定小数点データを扱える言語は、限られています。昔から主に大型コンピュータで使われているCOBOLやPL/Iでは固定小数点実数型があります。例えば、PL/Iで、"FIXED DEC(10,4)"と言う型は「固定小数点十進10桁、うち、小数点以下4桁という型」です。新しめの言語でも何かあったような気がしますが、ちょっと思い出せません。

投稿日時 - 2009-02-22 13:11:30

お礼

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

投稿日時 - 2009-02-23 00:14:52

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

投稿日時 - 2009-02-22 10:54:30

補足

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

投稿日時 - 2009-02-23 00:10:20

あなたにオススメの質問