「初めてのRuby」 3章 数値
今日も淡々と読書メモ。
箇条書きばっか使って書くと読みづらいのでスタイルを変えてみた。
3.1.1 整数リテラル
整数をそのまま数字で書いてやればIntegerオブジェクトが作られる。2,8,16進数はPerlと同じ表記が使えるので難しいことはない。
それよりも、なんとなくp使って出力したら(親切にも?)10進数に変換して出力された。
p 255 #=>255 p 0xff #=>255 p 0377 #=>255 p 0b11111111 #=>255 p "0b11111111" #=>"0b11111111"(これは数値じゃなくて文字列)
計算効率を考え、小さい整数は固定長のFixnumオブジェクト, 大きい整数は多倍長のBignumオブジェクトが適宜使い分けられている。環境によって境界線が異なるとのことなので、Scientific Linux 6.1を入れたさくらVPSでためしたところ63ビットと64のところに境界がきていた。
p (0x3FFFFFFFFFFFFFFF).class #=>Fixnum p (0x3FFFFFFFFFFFFFFF + 1).class #=>Bignum
3.1.2 浮動小数点リテラル
Perlの場合、数値は全て倍精度浮動小数点数として扱っているが、Rubyは型を厳密に区別しているので、浮動小数点はFloatオブジェクトとなる。
p 123.class #=>Fixnum(これは整数) p 123.0.class #=>Float(浮動小数) p 123.4.class #=>Float
特殊な浮動小数点数としてInfinity(正の無限大)と-Infinity(負の無限大)、NaN(非数)がある。
判別にはinfinite?メソッド(無限ですか?)とfinite?メソッド(有限ですか?)、nan?メソッド(非数ですか?)が使える。
p ( 1.0 / 1.0).infinite? #=>nil(無限ではない) p ( 1.0 / 1.0).finite? #=>true(有限です) p ( 1.0 / 0.0).infinite? #=>1(正の無限大です) p ( 1.0 / 0.0).finite? #=>false(有限ではない) p (-1.0 / 0.0).infinite? #=>-1(負の無限大です) p (-1.0 / 0.0).finite? #=>false(有限ではない) p ( 1.0 / 1.0).nan? #=>false(非数ではない) p ( 0.0 / 0.0).nan? #=>true(非数です)
3.2.1 除算
加減乗除の書き方はPerlでも見慣れた記法だが、除算だけちょっと挙動が違う。
浮動小数点数としてNaN(非数)が存在するので「ゼロで割ったら必ずエラーになる」とは限らない。
p ( 3 / 0) #=>divided by 0 (ZeroDivisionError) p (3.0 / 0) #=>Infinity p ( 3 / 0.0) #=>Infinity
3.2.4 その他の数値演算
よく使いそうな演算はメソッドが用意されている。これは便利!
p 10.divmod(3) #=>[3, 1](整除と剰余の配列) p -10.abs #=>10(絶対値) p 9.4.ceil #=>10(小数点以下を切り上げ) p 9.4.round #=>9(調べたら四捨五入もあった!)
3.2.5 型と自動変換
Rubyは型を厳密に区別・・・というより数値もオブジェクトなので特定のクラスに属することになるから明示的な変換が必要となる。
p 1 + "2" #=>String can't be coerced into Fixnum (TypeError)(数値に文字列を加算しようとしてエラーになった) p 1 + "2".to_i #=>3(文字列"2"をto_iメソッドで数値に変換した) p 1 + 2.0 #=>3.0(整数オブジェクトと浮動小数点オブジェクトはメソッドを使わないでもよろしく変換してくれる)
3.3 比較
比較演算子もPerlなどと同じ。整数と不動数点についてはここでもよろしく比較してくれている。
p 1 == 1.0 #=>true(整数1と浮動小数点数1.0の比較は一致扱い) p 1 == "1" #=>false(整数1と文字列"1"の比較は不一致)
3.4 数学関数
Mathモジュールを使うと三角関数を使ったり、一般的な定数(円周率、自然対数の底)を扱える・・・ということだけ憶えておく。詳しくは必要になったら調べる。
3.5 ビット演算
こちらもPerlと同様の記法が使える・・・ということだけ憶えておく。詳しくは(ry
今回の「数値」はさらっと終わったけど次の「文字列」は割りとボリュームがある。ずらずら長いと読み返すのに面倒なので、区切りが良い部分を見つけて2回ぐらいに分ける予定。
ちなみに読書メモは復習がてら書いてるので、実際には今日から6章を読み始めたところ。