痔になりやすい生活習慣とは?

浮動小数点について勉強していますが、本を見てもよくわかりません。

「イクセス表記とは、本来8ビットで表現できる値は0~255であるのに対し、元の値に127を加算することにより、-127~128までの表現を可能としています。つまり、Eが0の場合は-127を、Eが127の場合は0を、Eがすべて1の場合は128を示しています。」(日経BP社)

とありましたが、
●127を加算したら、なぜ-127~128か?このマイナスはどうしてでてくるのか?

何か、例をあげて教えてもらえればうれしいです。
よろしくお願いします。

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

A 回答 (3件)

>本来8ビットで表現できる値は0~255


------------------------
11111111 = +255
11111110 = +254
……
10000001 = +129
10000000 = +128
01111111 = +127
01111110 = +126
……
00000001 = +1
00000000 = 0
------------------------

>イクセス表現とは、元の値に127(01111111)を加算
------------------------
11111111 = +128 >Eがすべて1の場合は128を
11111110 = +127
……
10000001 = +2
10000000 = +1
01111111 = 0 >つまりEが127の場合は0を
01111110 = -1
……
00000001 = -126
00000000 = -127 >Eが0の場合は-127を、
------------------------

ということで,8ビット=256通りのパターンに
どの数値に対応づけているかが違うわけです。

符号なし固定小数点数では,
(11111111)~(00000000)に +255~0を対応。

イクセス127のゲタばき表現では,
(11111111)~(00000000)に +128~-127を対応。※

ちなみに,符号あり2の補数表現では,
(01111111)~(00000000)に +127~0,
(11111111)~(10000000)に -1~-128となります。

(※ celtisさんご紹介のURLに詳細がありますが,
IEEE 754 では指数部がオール1・オール0
の数を,特殊な数に対応づけています。)


>ビット反転+1よりも、127加算するほうが単純
------------------------
仮数に登場する負の数の表現には「2の補数」を使う意味があるけれど,
指数に登場する負の数には補数を使う意味がないということですよね。

指数の大きさを合わせた後の仮数同士の計算は,
(+5)+(-3)=(+2)
でよいから,「補数の加算,で減算を実現」できる2の補数の意味がある。

でも,(aの5乗)+(aの-3乗)のような異なる指数の計算では,
指数をそのまま加減算してもダメですからね。
------------------------
    • good
    • 1
この回答へのお礼

ありがとうございました。

お礼日時:2007/02/12 11:36

指数部の表記を単純化するためでしょうね。


2の補数を使用すると指数部のトップビット(左端のビット)が符号を表しますが、127を加算する(バイアスもしくは下駄履きとも表現する)ことで見かけ上は正の整数で表すことができます。

「ビット反転+1」するよりも、単に127加算するほうが単純ですから。

http://docs.hp.com/ja/B3906-90007/ch02s02.html
    • good
    • 1
この回答へのお礼

ありがとうございました。

お礼日時:2007/02/12 11:37

> ●127を加算したら、なぜ-127~128か?


> このマイナスはどうしてでてくるのか?

127を加算した結果が -127~128 になるのではなく,
元の値 (-127~128) に127を加算することにより,
8ビット無符号整数 E=0~255 にするのです.
だから元の値は E-127 です.
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2007/02/12 11:36

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

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

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

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

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

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を...続きを読む

Q2進数のバイアス表現について

浮動小数の計算でバイアス表現ってのがありますが、これってなんなんですか?
いろんなサイトを見て回ったのですが理解できませんでした。
負の表現をなくすらしいですが、バイアスは一体なんのために必要なんですか?
もしバイアス表現なしだと仮定した場合どうなるんでしょうか?

指数に確か127を足すらしいですが、それってなぜ127なんですか?

分かりやすい回答お願いします。

Aベストアンサー

#1です。

「ピンときません」
ということですが、そういうことを言っているのではなくて、そうなっていると言っているのであって、そうかと思っていただくしかないのですよ。

「-0.1とか、0.00001234とかを表すことができないとありますが、っていうことは仮数部には小数はいれちゃいけないんですか?」

小数は入りますが、「1」より大きい小数になります。
「1+a*2^(-1)+b*2^(-2)+・・・(a,bは0か1)」の形だから、どうしても「1」よりは大きいでしょう。

実際に仮数部で表現されるのは、a,b,・・・ですが、「1」を足すので必ず「1」より大きくなる。「1」は仮数部にはないが、必ず「1」があるとして計算するので、「1」より小さい数は仮数部では表現されない。「1」より小さい小数は、10進数で表せば、
0.00001234=1.234*10^(-5)
の形の表現になるのです。

浮動小数点は2進数なので、0.00001234の仮数部は、
1001111 00000111 11100101
になっていて、10進数で表せば、
1*2^(-1)+0*0^(-2)+0*2^(-3)+1*2^(-4)+1*2^(-5)+・・・=0.6174284221
ですが、「1」を加えるので、1.6174284221になります。

指数部は、
1101110
になっていますが、これは10進で110です。
バイアス127をひくので、110-127=-17

それで、

1.617428422*2^(-17)=1.234*10^(-05)

になります。

「指数部の最小が1ということは実際にはn=0を抜いた値
-126~255までの数が一般に使える指数部の数でしょうか?」

そうです。

0もありますが、それは特別な扱いなので、
指数の計算で使えるのは、-126~255です。

「仮数部の最小が1+2^(-23)」

仮数部の0も特別な扱いなので、仮数部を「1+0」にする指数計算はできません。仮数部は単精度なら、23ビットなので、その最小ビットが1で最小で、2^(-23)です。

ちょっとややこしいですが、要するに、
1.###・・・×2^n
の形で数を表現しているということです。

ピンとくる来ないじゃなくて考えましょう。

#1です。

「ピンときません」
ということですが、そういうことを言っているのではなくて、そうなっていると言っているのであって、そうかと思っていただくしかないのですよ。

「-0.1とか、0.00001234とかを表すことができないとありますが、っていうことは仮数部には小数はいれちゃいけないんですか?」

小数は入りますが、「1」より大きい小数になります。
「1+a*2^(-1)+b*2^(-2)+・・・(a,bは0か1)」の形だから、どうしても「1」よりは大きいでしょう。

実際に仮数部で表現されるのは、a,b,・・・ですが、「...続きを読む

Q浮動小数点の正規化方法について

基本情報処理技術者試験を20日に受けます。勉強不足で困っています。どなたか教えてください。
問題「数値を16ビットの浮動小数点表示法で表現する。10進数0.375を正規化せよ:ここでの正規化は仮数部の有効数字よりも上位の0がなくなるように指数部を調節する操作である。」 
答え「0111111000000000」 最初の1ビットが仮数部の符号、次の4ビットが2のべき乗の指数部で負数は2の補数、残りの11ビットが仮数部の絶対値
となっています。
0.375を2進数に直すところまではわかったのですが、次の正規化がよくわかりません。よろしくお願いいたします。

Aベストアンサー

10進数の0.375は、2進数は0.011です。
使用できるビット数が指数部、仮数部ともに限りがありますので、0.011をそのまま表記すると、仮数部が011となります。この先頭の"0"は別になくてもいいですよね?その分を指数部であらわせば、仮数部の桁を一桁稼ぐことができます。つまり、より正確な値を保持できることになります。これが正規化する意義です。

仮数部を(2倍)したわけですから、指数部は(1/2倍)します。よって指数部は(-1)です。負数ですから2の補数で表示すると1111(4ビット)になります。

浮動小数点表示は、正規化が絡んできますので、場合によっては情報落ちや桁落ちなどが発生します。このあたりを、再確認して試験に臨んでください。

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

Q浮動小数点の正規化の必要性について

 浮動小数点の正規化の必要性について教えてください。

 浮動小数点で数を表す際に、正規化は必ずしも必要なもの(行わなければならないもの)なのでしょうか?
 
 また浮動小数点の正規化のルールとして、
 2進数か16進数に変換したとき
 「指数部を調整して、仮数部の最上位けたを“0以外にする”」というルールがあるようなのですが、何故「指数部を調整して、仮数部の最上位けたを“0以外にする”」という処理が必要となるのでしょうか?

Aベストアンサー

回答ANo.1への補足,に対して。

浮動小数点数における正規化の必要性を説明するのに2進数を持ち出す必要はありません。10進数のままでも説明できます。

一例としてANo.2で挙げられた仮数部長で説明すると,2進数で23bitということは,10進数の桁に換算するとlog10(2^23)=約7桁となります。

もし仮に,仮数部・指数部ともに10進数で記録する浮動小数点数があると仮定し,さらにその仮数部長が7桁だと仮定するならば。

>[10進数]
>0.0000000000123456789012345678901234567890

という数は,7桁の仮数部長では正確に表現できませんから,丸め誤差が生じます。
同じ数値であっても,仮数と指数を組み合わせれば無限のパターンの表現ができます。今回の場合は,次の7つのパターンのうちのいずれかの表現形式を積極的に採用することになるでしょう。

(0.1234567)×10の-10乗
(0.0123456)×10の-9乗
(0.0012345)×10の-8乗
(0.0001234)×10の-7乗
(0.0000123)×10の-6乗
(0.0000012)×10の-5乗
(0.0000001)×10の-4乗

上記はすべて同じ数値なのですが,では「限られたビット数の中に少しでも多くの情報を詰め込」んでいるのはどれでしょう? 仮数部の長さ(=有効桁数)をムダにしないで,同じ数値であってもより精度の高い数として表現できているのはどのパターンでしょう?

その答えは「指数部を調整して、仮数部の最上位けたを“0以外にする”」というルールにのっとった,(0.1234567)×10の-10乗 であるのは明らかではないですか。

追伸.
ANo.2では IEEE754の「隠れ"1"表現」にまで触れているのですが,今回の問いに回答するだけならばそれは不要だと判断しましたので,省いてあります。

回答ANo.1への補足,に対して。

浮動小数点数における正規化の必要性を説明するのに2進数を持ち出す必要はありません。10進数のままでも説明できます。

一例としてANo.2で挙げられた仮数部長で説明すると,2進数で23bitということは,10進数の桁に換算するとlog10(2^23)=約7桁となります。

もし仮に,仮数部・指数部ともに10進数で記録する浮動小数点数があると仮定し,さらにその仮数部長が7桁だと仮定するならば。

>[10進数]
>0.0000000000123456789012345678901234567890

という数は,7...続きを読む

Q基本情報の浮動小数点について

基本情報技術者試験の勉強をしているのですが、浮動小数点の問題がどうしても解けません。問題を読んでもいまひとつ理解できず、四苦八苦しています。
下記の問題なのですが、教えていただけますでしょうか。
(平成12年に出題された問題(十進数0.375を正規化)は、理解できました)

問題集には解き方が載っているのですが、それが理解できません。解き方は以下です。

26.5を長さ32ビットの浮動小数点で表す

(1) 26.5を16進数に変換

 26.5の2進数:11010.1
 11010.1の16進数:0001 1010 . 1000
1  A . 8  
(2) 小数点位置の移動
       
 小数点を左に2けた移動:1A.8 → (0.1A8) × 16の2乗
 #ここまでは理解できます

(3) 指数部の値16の2乗 → 16の0乗を(1000000)2進数=64とする
 #ここがまるで分かりません
       16の2乗の2を64に加える
       1000000 … 64の2進数
      + 10 … 2の2進数
      ─────
       1000010 … 指数の値とする
 #「16の0乗を1000000=64とする」の部分が分かりません
(4) まとめ
 符号 指数部 仮数部
  0│1000010│0001│1010│1000│00…0
    16の2乗 1  A  8
 #符号と仮数部は理解できるのですが、指数部が分かりません

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

基本情報技術者試験の勉強をしているのですが、浮動小数点の問題がどうしても解けません。問題を読んでもいまひとつ理解できず、四苦八苦しています。
下記の問題なのですが、教えていただけますでしょうか。
(平成12年に出題された問題(十進数0.375を正規化)は、理解できました)

問題集には解き方が載っているのですが、それが理解できません。解き方は以下です。

26.5を長さ32ビットの浮動小数点で表す

(1) 26.5を16進数に変換

 26.5の2進数:11010.1
 11010.1の16進数:0001 1010 . 1000
...続きを読む

Aベストアンサー

確かにつまずきやすいところです。

>指数部の値16の2乗 → 16の0乗を(1000000)2進数=64とする

指数部にも+と-が有る事はお判りですね。
指数部では、2の補数と言うのを使わずに、64のところをゼロ乗と決めたのです。
64より小さければ負、64より大きければ正なのです。
ほんとに紛らわしいですよね。

Qべき乗

べき乗とは一体なんですか?
ウィキを見ても理解できませんでした。
2の2乗は2×2ですが、
2のマイナス2乗は一体どのような式なのですか?

Aベストアンサー

算数の延長線上だけの概念だけだといまいち理解出来ないですよね。
べき乗って要は指数なんですけど、
そういう難しい話を出来るだけ捨てて、算数の世界で説明出来る位まで掘り下げて説明します。

例えば 10の2乗は100、10の3乗は1000となります。
これを数字の動きに目を合わせてもう一度、書いてみます。
00010.00000 ←これを2乗すると↓
00100.00000 //10という値が左に1つずれた結果が答え

00010.00000 ←これを3乗すると↓
01000.00000 //10という値が左に2つずれた結果が答え

こういう風に表す事が出来ます。
じゃあ、10のマイナス2乗ってなった場合はどうなるのかというと、
00010.00000 ←これを-2乗する↓
00000.01000 //10という値が右に3つずれた結果が答え

という答えになります。
1を基準点として、右や左にいくつずれるか。
これがべき乗なのです。


で、2のべき乗を考えた時は、
全部2進数で考える必要があります。
00010.00000 ←2進数で表した数値の2
00100.00000 ←2乗した結果。数値で言うと4
00010.01000 //-2乗した結果。数値で言うと0.25


これで何となく分かっていただけたでしょうか?
ちなみに37のx乗を計算するみたいな時があったとしたら、
それは37進数で考えるという計算が必要になるのです。

算数の延長線上だけの概念だけだといまいち理解出来ないですよね。
べき乗って要は指数なんですけど、
そういう難しい話を出来るだけ捨てて、算数の世界で説明出来る位まで掘り下げて説明します。

例えば 10の2乗は100、10の3乗は1000となります。
これを数字の動きに目を合わせてもう一度、書いてみます。
00010.00000 ←これを2乗すると↓
00100.00000 //10という値が左に1つずれた結果が答え

00010.00000 ←これを3乗すると↓
01000.00000 //10という値が左に2つずれた結果が答え

こういう風...続きを読む

QIEEE754 浮動小数点について

IEEE754 浮動小数点で
(-1)~s×1.M ×2(E-127)
とありますが、2の指数部のE-127の理由がわかりません。
なぜ、127を引く必要があるのでしょうか?

また、仮数部の1.Mとする理由と併せて教えていただけると助かります。

※べき乗部の指数などの表記がうまく入力できない為、見づらくて申し訳ありません。

アドバイスよろしくお願いいたします。
また、参考サイトなどあれば、リンクお願いします。

Aベストアンサー

http://oshiete.goo.ne.jp/qa/2700742.html の私の過去の回答ANo.3

>仮数部の1.Mとする理由

0.M ではなく 1.M(いわゆる,隠れ"1"表現)を用いることで,仮数部の有効ビット数(精度)を1ビット長くすることができるから。

Q桁あふれがわかりません

負数を2の補数で表現する符号付き16ビットの2進数を16進法で表示したもののうち,4倍するとあふれが生じるものはどれか。


ア 1FFF   イ DFFF   ウ E000   エ FFFF

(平成19年春 問3)


この問題の解説は以下の通りです。

DFFFの2進数表示は、1101 1111 1111 1111 で、4倍すると0111 1111 1111 1100 となり、負数が正数になるのであふれが生じる。

このように書いてありました。

1つ目の質問は、4倍すると1111 1111 1111 1100 となり、正数にはならないのではないか、ということです。
2つ目の質問は、直接この問題には関係ないかもしれないのです。
「元の数が負数のとき、左シフトで0が消えたとき、桁あふれという」と習ったのですが、なぜ0が消えると桁あふれとなるのでしょうか。

以上です。宜しくお願い致します。

Aベストアンサー

 2進法の負数の表記法をしっかりと理解できていないようですね。

 2進数の負数は、「2の補数」という表記法を取ります。ここまではよいですよね?
 つまり、一番左のビットが「0」のとき正数、「1」のとき負数とするお約束です。
 ただし、これは一番左を「符号ビット」として固定して使用するというわけではありません。あくまで。一番左のビットも含めて「数値」を表しているのです。
 従って、2倍、4倍で左シフトするときにも、全体を左シフトし、符号を表す一番左のビットだけ特別扱いするものではありません。

 これは、「正数」のときはすんなり納得できるはずです。

 たとえば、十進数で「43」(例なのでいくつでもかまいません)は、2進数で

   0000 0000 0010 1011

です。これを、2倍、4倍すれば、

 2倍→  0000 0000 0101 0110 (十進数で「86」)
 4倍→  0000 0000 1010 1100 (十進数で「172」)

で、上位桁は「0」なので桁あふれはしていません。

 これが、左シフトを繰り返して、

   0101 0110 0000 0000

になったところで、さらに2倍すると、

   1010 1100 0000 0000

となり、一番左が「0→1」となって桁あふれします(補数表記だと「負数」になってしまう)。要するに、大きくなりすぎて「表記範囲逸脱」となるわけです。

 これが「負数」の場合だと、「0」と「1」の関係が逆転するわけです。つまり、「-43」は、補数表記(2の補数)で

   1111 1111 1101 0101

となります。これを2倍、4倍すると、
      
 2倍→  1111 1111 1010 1010 (十進数で「-86」)
 4倍→  1111 1111 0101 0100 (十進数で「-172」)

となります。上の方に書いた「正数」とは、それぞれ2の補数であることが分かりますよね。

 つまり、「正数」では「0が桁あふれしても問題ない」のと同じように、負数では「1が桁あふれしても問題ない」のです。何故なら、補数表記だからです。

 これが正数と同じように、左シフトを繰り返して、

   1010 1010 0000 0000

になったところで、さらに2倍すると、

   0101 0100 0000 0000

となり、一番左が「1→0」となって桁あふれします(突然「正数」になってしまう)。マイナス側に大きくなりすぎて「表記範囲逸脱」となるわけです。

 ということで、非常に長くなりましたが、「正数の0の桁上がりは桁あふれではない」のと同じように、補数表記だと「負数の1の桁上がりは桁あふれではない」ということを理解すれば、納得できるのではないでしょうか。


 ご質問に対しては、

>1つ目の質問は、4倍すると1111 1111 1111 1100 となり

→いいえ、1101 1111 1111 1111 を4倍すると、単に2桁左シフトで 0111 1111 1111 1100 となります。
 上に書いたように、一番左のビットが「符号ビットで固定」と考えるのは間違いです。

>2つ目の質問:
>「元の数が負数のとき、左シフトで0が消えたとき、桁あふれという」と習った

→正確には、「元の数が負数のとき、左シフトで数値としての0が消えたとき(数値としての0が符号ビットの位置になってしまったとき)、桁あふれという」ということかと思います。

 2進法の負数の表記法をしっかりと理解できていないようですね。

 2進数の負数は、「2の補数」という表記法を取ります。ここまではよいですよね?
 つまり、一番左のビットが「0」のとき正数、「1」のとき負数とするお約束です。
 ただし、これは一番左を「符号ビット」として固定して使用するというわけではありません。あくまで。一番左のビットも含めて「数値」を表しているのです。
 従って、2倍、4倍で左シフトするときにも、全体を左シフトし、符号を表す一番左のビットだけ特別扱いするものではあり...続きを読む

Q2進数の割り算が分かりません・・・。

2進数の割り算が分かりません・・・。
授業でいきなり出てきて大変に戸惑っています。
10010➗11(2進数)
の解き方を教えてください。
よろしくお願いします・・・!

Aベストアンサー

2進数の場合の割り算は引く事が出来るか?をフラグを立てていく感じになります。


人気Q&Aランキング