マンガでよめる痔のこと・薬のこと

浮動小数点の計算に関してですが、IEEE標準形式とエクセス64形式というものがありますが、どういう時にどう使って計算するべきなのか分かりません。
参考書を読むと「なるほど、基数に足すんだな」などと何となく思うのですが、どういう問題が出たときにどちらをどう使うべきなのか、どういう問題が出た時には使ったらいけないのか・・・さっぱりです。
2つの使い方と使い時について説明していただけないでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (3件)

問題を解くときは、問題文で表示形式が指定されている場合、その表示形式


として解き、指定されていなければ、一応IEEE754で解きます。

実務の場合。
どちら(それ以外の場合もありうる)を使っているかは、ハードウェア次第、言語次第で、選ぶことはできません
EWSやパソコンはIEEE754仕様(浮動小数点演算装置の仕様がこうなっている)であり、
IBMの大型コンピュータの仕様はエクセス64形式
(ということは、日立、富士通などの大型コンピュータはIBM互換仕様だったのでエクセス64。)
※最近はどうなのかは、わかりません。

なお、IEEE754とエクセス64形式での計算結果は「一致しません。」
たとえば、単精度実数の場合、
IEEE754:最大で、10^38まで表示可能。
エクセス64:最大で、10^72まで表示可能。
ですので、たとえば、fortranで
      x=1.0E50   (1.0×10^50)
とか書いたら、IEEE754ではオーバーフローでアウト。

また、IEEE754では、表示形式以外にも計算結果の精度も規定されているので、
CPUが違っても計算結果は変わらない(ただし、四則演算と√までなのと、数値の丸め方法をあわせるという条件で。)
けど、エクセス64(というより、IEEE754以前のコンピュータ)は
計算結果の精度については結構イイカゲンで、
   X1=Y/5.0   と、
   READ (5,*) Z Zにファイルから5を読み込んだとします。
   X2=Y/Z
   ※変数は全て単精度(FORTRANの暗黙宣言どおり)です。
X1とX2は、最後の1ビットに至るまで同じ(同一コンピュータ、同一言語で。)であるはず、
なんだけど、そうならない。微妙に結果がズレます。
ということは、こういうズレを前提としてプログラムを組まないと
意図するとおり動かなかったのです。
一般論で書くと、(いや、上記は、一般論よりとんでもないのだけど...)
・整数で 整数÷整数 が割り切れても 、実数ではそうならない
 したがって、実数の値を比べるときイコールで判定してはならない。
 ある程度の幅を持たして比較しないとならない。
 
 ※IEEE754やMicrosoftBasicの旧版は、大きい整数は別として、こんな現象は起きない(いや、めったに起きないだけかも)
  ので、(単純な四則演算の結果の比較なら)こういうことにシビアでなくてもいい
  けど、昔はそうではなかったのです。
ですので、エクセス64で科学技術計算プログラムを組むのは、
IEEE754で組むのより疲れます。

エクセス64で組んだプログラムをIEEE754に変換するのは
使える数値の範囲にさえ気をつけていれば、まあ大丈夫の可能性が高いけど、
IEEE754で組んだプログラムをエクセス64に変換するると、
思ってもみなかったところでエラーが多量に生じます。
今となっては、こんなことやる必要自体、まず生じないと思いますが.....
    • good
    • 0
この回答へのお礼

なるほど、普段はIEEE754を使う事を心がければ良いのですね…。
使いどころの違いが分からず悩んでおりました。
丁寧な解説ありがとうございます。

お礼日時:2008/06/22 13:46

基本的には計算機のハードウェアがどちらの形式をサポートしているかという問題でしょう。

浮動小数点フォーマットは昔は計算機ごとに色々とありましたが、IEEE標準規格ができてほとんどはそれに従っています。エクセス64形式は歴史的経緯で残っているだけと思いますけど。
普通はIEEE標準形式を使えば良いかと思いますが、そもそも浮動小数点フォーマットを意識しなければいけない問題ってそうそうないと思いますけど。
    • good
    • 0
この回答へのお礼

なるほど……。
ありがとうございます。

お礼日時:2008/06/22 13:46

要は「同じものの違う表現」なので, どっちを使っても本質的に同じです.


10進数と 16進数で「どういう問題がでたときにどちらをどう使うべきなのか」を考えてみてください. あんまり意味ないでしょ?
    • good
    • 0
この回答へのお礼

確かに・・・。

お礼日時:2008/06/22 16:33

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q浮動小数点(エクセス64形式)、倍精度(64bit)仮数部は何bit?

タイトルの通り、エクセス64形式の倍精度(64bit)のときの指数部、仮数部がそれぞれ何bitなのかわかりません。IEEE形式のものと、単精度(32bit)のものは調べられたのですが・・・
(421C 1999 9999 99A0)
等、いくつかエクセス64形式で表記された値があり、これを実数でいくつになるか確認するためです。

よろしくお願いします。

Aベストアンサー

参考URLによると
1,7,56
みたいですね

参考URL:http://cs.maritime.kobe-u.ac.jp/waka/course/ip2004s/IPnt03b.pdf

Q浮動小数点:エクセス64について

浮動小数点を表現するエクセス64で表現されている8バイトの実数である以下の2つがあるのですが、

40 19 99 99 99 99 99 9a (16進)
41 18 00 00 00 00 00 00 (16進)

それぞれ0.1と1.5らしいのですが小数点以下の部分のエクセス64での表現がよくわかりません。

どなたか解説をしていただける方はいらっしゃいますでしょうか。

よろしくお願いいたします。

Aベストアンサー

41の次の18ですが、0001 1000
最初の4ビットが、"1"で、次のビットから順に0.5、0.25、0.125(2のマイナス3乗)を表していると考えれば・・・ホラ、判りますね?
(2進数の場合、左隣の桁は2倍、逆に右隣の桁に行くことは、0.5倍と考えてください。)

0.1の方は、上記をヒントにすれば、判りますか?
(私は面倒なのでやりません(^o^))

ちなみに、40、41の部分は指数部ですね。

Q10進数の14.5を浮動小数点(IEEE754形式)の2進数に変換するにはどうしたらよいでしょうか?

10進数の14.5を浮動小数点(IEEE754形式)の2進数に変換するにはどうしたらよいでしょうか?
10進数の-7.5を浮動小数点(IEEE754形式)の2進数に変換するにはどうしたらよいでしょうか?
計算方法を教えてください。

Aベストアンサー

14.5を符号と指数と仮数に分けます。
符号は正の数なので符号は0
次に14.5を符号無し2進数に変換すると
1110.1
小数点を左に移動させて1だけ残すと
1110.1=1.1101*2^3
仮数は23ビットで小数点より右側だけなので、足りない分を0でうめて
11010000000000000000000
指数の3を127でバイアスするので
3+127=130
これを2進数に直すと
10000010
全て合わせると、
01000001011010000000000000000000
で、32ビットの2進数に変換できました。
同じように、-7.5を変換すると、
符号は負の数なので1
-7.5を符号無し2進数に変換すると、
 111.1
=1.111*2^2
なので、仮数は
11100000000000000000000
指数の2を127でバイアスすると
2+127=129
これを2進数に直すと
10000001
全て合わせると
11000000111100000000000000000000
になります。
64ビットの場合は、指数のバイアスを127から1023にし、仮数の23ビットを52ビットまで増やせばOKです。

14.5を符号と指数と仮数に分けます。
符号は正の数なので符号は0
次に14.5を符号無し2進数に変換すると
1110.1
小数点を左に移動させて1だけ残すと
1110.1=1.1101*2^3
仮数は23ビットで小数点より右側だけなので、足りない分を0でうめて
11010000000000000000000
指数の3を127でバイアスするので
3+127=130
これを2進数に直すと
10000010
全て合わせると、
01000001011010000000000000000000
で、32ビットの2進数に変換できました。
同じように、-7.5を変換すると、
符号は負の数なので1
-7.5を...続きを読む

Q浮動小数点数(エクセス)

こんにちは。
ちょっとわからない問題があったので
解説お願いします。
エクセス64で、
(C1300000)16
を10進数で表現ってどうすればいいんですか?

Aベストアンサー

(C1300000)16を2進数に変換して
(11000001001100000000000000000000)2
これを、各部に分けると、
符号部:1
指数部:1000001→65
仮数部:00110000~
符号部が「1」なので、「マイナス」
指数部が65なので64を引いて「16^1」
仮数部は「0.0011 0000 0000 ~」を指数部で示された桁数(4桁)だけ小数点を右にずらすので
「11.00 0000 0000 0000~」→3
全部併せて、「-3」でしょう。