
解説書などには、「浮動小数点は3.14E0の形」や「固定小数点は3.14」などと説明されています。
では、例えば、ごく一般的な32ビットマシンで「3.14 * 45.6」という命令を書いたときに演算されるのは浮動小数点演算なのか、固定小数点演算なのかがわかりません。例えばIntelのx86CPUは、内部にFPUを持っているそうですが、この場合は「3.14 * 45.6」は、内部では必ず浮動小数点演算になっているということなのでしょうか?
「3.14 * 45.6」を「3.14E0 * 4.56E1」と書いた場合にしか浮動小数点演算されないということではないと思っているのですが、実際の浮動小数点演算と固定小数点演算の内部的な切り替えがわかりません。
理解が足りなくて、おかしな質問になっていましたら、その点もご指摘いただければうれしいです。
No.1ベストアンサー
- 回答日時:
コンピュータで固定小数点演算というのは、整数のことです。
表現的には「3.14」を固定小数点と言っても、コンピュータ
の演算は、整数と浮動小数点しかありません。
整数は、小数点の位置が一番左と捉えられますので、固定小
数点です。
3.14*45.6はコンパイラは必ず浮動小数点演算を行います。
314*456/1000などとはしない訳です。
例えばC言語の型は何がありますか?
数はintやfloatであとはそれらの精度の違いしかありま
せん。整数と浮動小数点しか無い、ということです。
CPUの命令を調べれは分かりますが、小数演算で、固定小
数点演算という命令は存在しません。
整数演算を固定小数点演算ということはあります。
あくまでも、表記方法が45.6が固定小数点表記で、
4.56E1の場合、浮動小数点表記ということですね。
早速のご回答、どうもありがとうございました。
整数と浮動小数点しか無い、というご説明は、すっきりとして理解しやすかったです。参考書によく書いてあるのは、表記としての表現なのですね。ありがとうございました。
No.5
- 回答日時:
DSP や組み込み系では固定小数での演算も考えられますが, 「ごく一般的な 32ビットマシン」で何も考えずに書いたら, 普通は浮動小数点演算になります. Java は浮動小数しかないので確定. C でも普通に考えれば浮動小数です (規格は未確認だけど固定小数であらわしているとは考えにくい).
なお, 本当にハードウェアのレベルまで落ちてしまうと, そこには「ビット」しかありません. そこからいろいろと配線をして「整数演算」をやったり「浮動小数演算」をやったりします. だから, (遅くなることを無視すれば) 整数演算だけで浮動小数演算をシミュレート可能です. たしかに 387 なしは遅かった....
蛇足かつ #4 は知ってると思うけど 80487SX は厳密には「FPU」ではない.
ご回答、どうもありがとうございました。
言語ごとの特徴も教えて下さって、ありがとうございます。ハードウェアのことも勉強したいと思います。
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
早速のご回答、どうもありがとうございました。
恥ずかしながら、プロセッサ内部の知識はほとんどないので、ご回答の内容もまだまだ消化できていない部分がありますが、整数レジスタのみで浮動小数点演算と等価なことができるとは知りませんでした。
まだまだ勉強しなければいけないことが盛りだくさんです。
どうもありがとうございました。
No.3
- 回答日時:
多くの言語では、小数点を含んだ数字表記は、浮動小数点表記であれ固定小数点表記であれ、浮動小数点データになります。
プログラム上の文字の字面と、データの種類はまた別です。浮動小数点データの演算は当然、浮動小数点演算です。整数でない固定小数点データを扱える言語は、限られています。昔から主に大型コンピュータで使われているCOBOLやPL/Iでは固定小数点実数型があります。例えば、PL/Iで、"FIXED DEC(10,4)"と言う型は「固定小数点十進10桁、うち、小数点以下4桁という型」です。新しめの言語でも何かあったような気がしますが、ちょっと思い出せません。
早速のご回答、どうもありがとうございました。
おっしゃるとおり、浮動少数点データの演算は浮動小数点演算なのですね。見た目と内部のデータは別だということが少し理解できました。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語について。 5 2023/06/27 18:37
- 数学 以下の問題が分かりません。 8ビット浮動小数点数が、最上位ビットから順に符号1ビット、指数部3ビット 4 2023/07/22 16:06
- 計算機科学 8ビット浮動小数点数 0 1000 100 を10進法 8ビット浮動小数点数 1 1100 011 3 2022/10/28 08:07
- 情報処理技術者・Microsoft認定資格 情報技術の問題についてです。 10進数の−36を以下のような16ビットの浮動小数点表示にするといくつ 3 2022/05/21 19:53
- 数学 すべての実数を整列させる方法を考えました。教科書が書き換わりますか? 53 2023/06/01 18:12
- 物理学 この波動関数の複素共役はなんですか? 2 2022/08/17 00:32
- 会計ソフト・業務用ソフト エクセルについて 1 2022/06/15 17:39
- 数学 「FFTの基本は、DFTはサンプル数Nが偶数なら 2つのDFTに分解できるということ。 分解するとD 3 2022/03/31 21:01
- 病院・検査 「胎児機能不全」と「子宮内胎児発育遅延」はまた別の疾患ですか? 点数本のハイリスク妊娠管理加算、ハイ 1 2022/10/19 23:16
- 物理学 ベクトルと座標系につきまして 1 2022/04/03 06:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ビットシフトってどんな時使うの?
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
PS3に搭載されている"Cell"は、...
-
数値計算における誤差について
-
DoJaで多倍長演算する方法
-
verilog 符号付加減算(最上位...
-
MIPSアセンブラの問題です。
-
命令について
-
10進数(+-)→2進数への変換(2)
-
上位ビットと下位ビットの入れかえ
-
算術右シフトの結果が1/2になる...
-
プログラムの割り算と掛け算
-
C言語のビット演算子に関して
-
浮動小数点演算と固定小数点演...
-
一般のソフトで画像を扱う場合...
-
プログラム
-
Python: 数値を反転させたい
-
fortran
-
整数除算の意味とは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
C言語で128bitの2進数のビット...
-
ビットシフトってどんな時使うの?
-
文字参照は10進数と16進数では...
-
エクセルVBAのIf,Then 構...
-
03分22秒36のような時間の単位...
-
一般のソフトで画像を扱う場合...
-
C言語やC++言語でビット毎に値...
-
シーケンス制御についての質問...
-
PS3に搭載されている"Cell"は、...
-
ビット演算子
-
Endianについて パート2
-
verilog 符号付加減算(最上位...
-
ビットの取り出し方法
-
PLC 命令について
-
命令について
-
符号無し整数xを右にnビット回転
-
16ビットCPUで32ビットの計算方法
-
浮動小数点数の内部表現につい...
おすすめ情報