| SQLインジェクション対策はおすみですか? 開発開始時点からのコンサルティングから、公開済みWebサイトの脆弱性検査、 脆弱性発見後の適切な対策まで |
2007-05-31 恐ろしい毒
●IEEE754のとりうる整数の範囲
hnwさんの日記は一見すると平易だが、恐ろしい毒がこっそり忍ばせてある。読者は表向きの平易に書かれたウンチクを楽しみながら、裏の毒を味わうという二重の楽しみを体験することができる。
今日はPHPのround関数に関して前回と違った切り口で紹介してみます。また、コンピュータ上での整数についても少し紹介してみます。
前回の記事「PHPの奇妙なround関数」(id:hnw:20070515)を読んで、小数点が付いた数なんてPHPで触ったことないから関係ないや、なんて考えた方が居るかもしれません。そんな方のために、今回は整数を四捨五入してみます。
[hnwの日記 - round関数で整数を四捨五入してみるより引用]
今回の毒は、以下の部分だ。そして、IEEE64bit浮動小数点数であれば仮数部が52bitありますので、-2の53乗から2の53乗(約9000兆)までの整数は全て正確に表現できます。つまり、今回登場した変数値はどれも見た目通りの整数です*1。
仮数部が52bitあると、どうして2の53乗までの整数が表現できるのか、それを理解するためには、2進浮動小数点数の内部表現についての理解が必要となる。
一般に、2進浮動小数点数は、以下のような内部表現をとる。
± 1.bbbbbbbbbbbb × 2^nnn
1.bbbの部分が仮数部である。仮数部の最上位桁が1固定になっている理由は正規化をしているためである。そして、最上位桁が1と決まってるからには、わざわざメモリ上の1ビットを割り当てる必要がないことから、現実のメモリ上の表現としては省略している。これをケチ表現(economized form)と呼ぶ。すなわち、IEEE754形式の浮動小数点数は、実際には仮数部は53bitあるわけだ。
ここで、仮数部が全て1となる数を検討してみよう。
1.111 ..... × 2^52 = 2^53 - 1
であるので、2^53 - 1までは表現できることがまず分かる。
この数に1を足すと、有効桁数としては54ビットとなるわけだが、末尾が0であるので、
1.0 × 2^53
として正しく表現できる。この数に1を足すと、有効桁数が足らないので表現できない。すなわち、2^53が正確に表現できる整数の上限となる。
このようにして、1 〜 2^53 までは表現できることがわかる。
負の数字については、符号ビットにより対応する。
ゼロについては、浮動小数点数の場合、特別扱いする必要があるのだが、IEEE754の場合は、前に述べた非正規化数の特別な場合(仮数部が全て0)として表現する。
符号なし2進52ビット固定小数点数の場合は、0 〜 2^52 - 1 の範囲の整数を表現できるわけであるが、IEEE754は仮数部のケチ表現などにより見かけの有効数字を桁増しして、2^53までの数値を正確に表現できる。巧妙な手法である。
このように複雑な内容を、hnw氏はサラリと書き流し、読者がワナに掛かるのを待っているのである。
まことに恐ろしい毒と言わざるを得ない。
- http://d.hatena.ne.jp/hnw/20070530 ×67
- http://d.hatena.ne.jp/hnw/ ×11
- http://d.hatena.ne.jp/ockeghem/ ×8
- http://a.hatena.ne.jp/ockeghem/ ×8
- http://b.hatena.ne.jp/entry/5151918 ×6
- http://www.saiyasuweb.com/ ×5
- http://nogue.cocolog-nifty.com/diary/2007/05/refiz... ×3
- http://www.math.sansu.org/u/diary/?date=20070529 ×2
- http://clip.livedoor.com/clips/fujidig/tag/浮動小数点 ×2
- http://d.hatena.ne.jp/ockeghem/20070528/1180387214... ×2
- http://www.everes.net/2007/jun/06/java-python-roun... ×2
- http://counter.hatena.ne.jp/ockeghem/log?cid=11&da... ×2
- http://search.live.com/spresults.aspx?q=とりうる ×2
- http://d.hatena.ne.jp/ockeghem/20070528 ×2
- http://search.live.com/spresults.aspx?q=IEEE754 ×1
- http://search.www.infoseek.co.jp/Web?qt=浮動小数点数 表現 ... ×1
- http://www.yahoogle.jp/redirect.php?url=http://www... ×1
- http://reader.livedoor.com/reader/ ×1
- http://b.hatena.ne.jp/entry/http://www.tokumaru.or... ×1
- http://search.www.infoseek.co.jp/Web?qt=ieee754 有効... ×1
- http://people.matome.jp/tag/徳丸 ×1
- http://d.hatena.ne.jp/housai/edit?date=20070526 ×1
- http://search.live.com/results.aspx?q=IEEE754&FORM... ×1
- http://search.live.com/results.aspx?mkt=ja-jp&FORM... ×1
- http://s.luna.tv/search.aspx?q=非正規化数 ieee 754&st=1... ×1
- http://d.hatena.ne.jp/hnw/comment?date=20070530 ×1
- http://d.hatena.ne.jp/ockeghem/20070522/1179805158... ×1
- http://d.hatena.ne.jp/housai/edit?date=20070525 ×1
- http://d.hatena.ne.jp/hnw/?of=5 ×1
- http://209.85.175.104/search?q=cache:Ir1mWc8LkSYJ:... ×1
- http://d.hatena.ne.jp/ockeghem/20070531/1180584071... ×1
- http://reader.livedoor.com/subscribe/http://www.to... ×1
- http://b.hatena.ne.jp/omaya/science/ ×1
- http://b.hatena.ne.jp/omaya/ ×1
- http://s.luna.tv/search.aspx?client=lunascape&s=0&... ×1
- http://search.live.com/spresults.aspx?q=IEEE754 範囲... ×1
- http://aff.80code.com/feedred/view.php?view=frames... ×1
- http://d.hatena.ne.jp/ockeghem/20070524/1179979230... ×1
- http://search.live.com/results.aspx?srch=105&FORM=... ×1
- http://209.85.175.104/search?q=cache:m4HNddTtabMJ:... ×1
- IEEE754 ×58 / IEEE 754 ×22 / ieee754 ×15 / キーワード不明 ×10 / IEEE-754 ×6 / ケチ表現 ×5 / 整数の範囲 ×5 / IEEE754 有効桁数 ×5 / IEEE754 範囲 ×4 / ieee 754 整数 ×3 / ieee 754 表現範囲 ×3 / このように複雑な内容を、hnw氏はサラリと書き流し、読者がワナに掛かるのを待っているのである。 ×3 / ieee754 有効桁数 ×3 / IEEE-754 整数 ×3 / doubleで表現できない整数 ×3 / IEEE754 正規化 ×3 / SQLServer 符号なし整数 ×2 / IEEE754 ×2 / 仮数部 すべて1 ×2 / IEEE754 浮動小数点数 ×2 / ケチ 表現 2進数 ×2 / IEEE64bit浮動小数点数 ×2 / JavaScript 54ビット ×2 / IEEE754 形式 ×2 / ieee754 変換 整数 ×2 / ieee754 表現 ×2 / IEEE754表現 ×2 / php 固定小数点 ×2 / 浮動小数点 IEEE 754 範囲 ×2 / ieee754 範囲 ×2 / php 整数の範囲 ×2 / IEEE754 仮数部 ×2 / 有効桁数 php ×1 / 浮動小数点 IEEE754 表現範囲 ×1 / 浮動小数点 桁数 ×1 / IEEE754 範囲 ×1 / IEEE 754形式の浮動小数点数 ×1 / hnw php round ×1 / php 四捨五入 整数 桁 ×1 / php 小数点 範囲 ×1 / php 整数 上限 ×1 / IEEE 754 仮数 ×1 / 数の内部表現 ×1 / ieee754 仮数部 ×1 / 浮動小数点数 IEEE754 ×1 / IEEE754 正確 ×1 / PHP 変数 整数 上限 ×1 / php 数値 桁数 ×1 / IEEE 754 javascript ×1 / PHP 整数 01 1 ×1 / 整数 表現 上限 ×1 / IEEE754 内部表現 変換 ×1 / IEEE754 24 ×1 / iEEE754 有効桁数 ×1 / 符号なし IEEE754 ×1 / hnw round ×1 / 浮動小数点数 double 有効桁数 ×1 / IEEE 754 変換 整数 ×1 / IEEE754 有効桁 ×1 / IEEE754 表現 ×1 / ケチ表現 暗黙の ×1 / 2進数 IEEE 754 ×1 / 16 ビットの整数の範囲 ×1 / 浮動小数点 JavaScript 指数部 上限 ×1 / IEEE754 有効数字 ×1 / IEEE 754 表現範囲 ×1 / 浮動小数点 正確 整数 ×1 / IEEE754 けち表現 ×1 / IEEE754 浮動小数点 扱い ×1 / php 整数 round ×1 / "ケチ表現" ×1 / IEEE754 最小 ×1 / 整数 範囲 php ×1 / PHP 指数部 ×1 / ieee 754 有効桁数 15 16 ×1 / IEEE754 ×1 / 浮動小数点数 有効桁数 仮数部 ×1 / IEEE 754 形式 ×1 / 有効桁数 浮動小数 ×1 / kccs 徳丸 ×1 / IEEE754 表現範囲 ×1 / php 固定小数点数 ×1 / 浮動小数点 52bit ×1 / ieee 754 有効桁数 ×1 / 徳丸浩の日記 - 恐ろしい毒 - IEEE754のとりうる整数の範囲 ×1 / 非正規化数 2 浮動小数点 -126 0 ×1 / IEEE754 浮動小数点形式 ×1 / IEEE754 指数部 仮数部 ケチ ×1 / PHP 整数 範囲 ×1 / 9000兆 double ×1 / 浮動小数点 IEEE 範囲 ×1 / IEEE754 整数 ×1 / 正規表現 負の数字 ×1 / IEEE 754 有効桁数 ×1 / ieee754 浮動小数点数 ×1 / IEEE 754 範囲 ×1 / IEEE754 変換 ×1 / IEEE 754 範囲 表現 ×1 / 整数 有効桁 ×1 / php 桁数 整数 ×1
| SQLインジェクション対策はおすみですか? 開発開始時点からのコンサルティングから、公開済みWebサイトの脆弱性検査、 脆弱性発見後の適切な対策まで |
お褒め頂いてありがとうございます。僕自身「doubleで表現できない最小の自然数は2^53+1である」ということに最近気づいたんですが、単体で記事を書く内容でもないかなと思ってストックしておいたんですね。今回それを絡めた記事を書いてみたわけなんですが、徳丸さんをはじめ知識のある方ほど「2^53までというのは中途半端だ」という違和感を持つようで、なかなか面白いものです。
そんなわけで、わざわざワナを潜ませているつもりはありません。むしろ、僕が本当に書きたかった内容がバレバレということかもしれませんね。