irb(main):032:0> [2.0**-1023+2.0**-1025].pack("E").unpack("Q")[0].to_s(2) => "1010000000000000000000000000000000000000000000000000" irb(main):033:0> [2.0**-1024+2.0**-1026].pack("E").unpack("Q")[0].to_s(2) => "101000000000000000000000000000000000000000000000000"のようにして,浮動小数点のビット表現をみてみるとこのあたりがわかると思います.
def maxrow(a,k) max_i=k for i in (k+1)..(a.length()-1) if abs(a[max_i][k]) < abs(a[i][k]) max_i = i end end max_i end上のプログラムでは,abs(a[max_i][k]) の計算が何度も行なわれる.これを節約するために,以下のように書いている人もいた.
def maxrow(a,k) max_i = k max_v = abs(a[k][k]) for i in (k+1)..(a.length()-1) v = abs(a[i][k]) if max_v < v max_i = i max_v = v end end max_i end
def maxrow(a, k) return a.index(a[k..-1].max_by{|ai| ai[k].abs()}) end
cd algo17を済ませてから,
ruby vote.rb 選択肢番号のように使います.
irbを使いながら(一旦終了せずに),投票システムも使うには,ターミナルのメニューバーの「シェル」->「新規タブ」を選ぶか,[Command]+[T]で別のタブを開いて(あるいは[Command]+[N]で別のウィンドウを開いて),投票システムを使うことをお勧めします.このあたりのことは,「はいぱーワークブック」の15.4 ターミナルの便利な使い方に書いてあるので参考にしてください.
irb(main):034:0> a = 0.5 => 0.5 irb(main):035:0> s = ("0"*64 + [a].pack("E").unpack("Q")[0].to_s(2))[-64..-1] => "0011111111100000000000000000000000000000000000000000000000000000" irb(main):036:0> [s[0], s[1..11], s[12..-1]] => ["0", "01111111110", "0000000000000000000000000000000000000000000000000000"]
cd ~/algo17と入力してください.これらの機能を使うと,irbを抜けずにvoteできます.
ターミナルの基本的な使い方は,はいぱーワークブックの15.2 ターミナルの基本的な使い方を,より高度な使い方は,15.4 ターミナルの便利な使い方を参照してください.
cdというコマンドと「~」の意味は,はいぱーワークブックの14.4 コマンドを使ったファイル操作の14.4.1 ディレクトリを読むと分かります.
iruby notebookを実行すると,Webブラウザ上で対応するタブが開きます.
include(Math)を入力するように書いています. 毎回入力するのが面倒な場合は,ホームディレクトリの下に「.irbrc」というテキストファイルを作り,その中に
include(Math)と書いておくと,irb起動時にこのファイルの中身を実行してくれるので,毎回指定しなくても大丈夫です.ただし,このファイルの実行中にエラーが出ないように正しく記述剃る必要があります.また,
Math.sqrt(2)のような形で指定すれば,
include(Math)は不要です.
ruby check.rb ex01.rbと実行すると,関数を与えた時の入力と出力があっていることが確認できます. 詳しくは,補足説明 (練習問題確認プログラムの使い方)を御覧ください.