iT邦幫忙

DAY 5
2

Ruby女孩:10萬.times { puts "為什麼?" }系列 第 5

Ruby女孩(5):Ruby的數學跟老師教的數學都不一樣?

昨天認識過Ruby的語彙符號之後,今天開始來認識Ruby資料型別中的數字

※Ruby的數字類別分層結構

這是書中所給的數字的類別樹狀圖,身為數學系畢業的學生,一連串的問題就在腦中浮現了...

「這數字分類好像跟真實數系不一樣?」

「Numeric再上一層,也就是他的爸爸、爺爺是誰?」

「Numeric的兄弟姐妹是誰?」

我是一個需要視覺化學習的人,沒看到整棵樹的全貌,很容易搞不清楚這些樹枝之間的關係與功能。

雖然書上提到Ruby的數字方法很直觀也不難,但還是想多花點時間先把前置經驗建構起來~

※數學的數系

看到這兩張樹狀圖就知道為什麼我會困惑這麼久了吧XD對我來說Integer包含於Rational包含於Complex(Integer的爸爸是Rational;Rational的爺爺是Complex),怎麼到了Ruby他們反而被寫在同一層了(大家都是兄弟姐妹)!

所以寫了一些程式碼來讓自己更理解一點,在數的後面加上.class,可以知道他是什麼類別!

哈,打到這裡出現兩個疑問,小的整數是Fixnum,那要多大才會變成Bignum呢?書中只提到儲存於31位元空間內的整數都是Fixnum,但還是太抽象了,所以我立馬試試到底Fixnum和Bignum的分界在哪?就出現了下面這個圖XD

我真的太無聊了XD不過也因此發現,原來19位整數是Fixnum,到20位整數就變成Bignum了!!

另外還有一個問題,3/2應該有兩種可能,一種是分數、一種是除完以後變成1.5的小數,但是用Ruby執行的結果卻是Fixnum?????????

再仔細翻翻書,就看到了答案,原來...【The Ruby Programming Language】p.46 所述:

『除法運算符取決於運算元所屬類別:如果兩個運算元皆為整數,則會進行截尾整數除法(truncating integer division)運算。如果有一個運算元是一個Float,則會進行浮點數除法運算。』

這樣可以了解為什麼3/2當時會出現Fixnum了,因為他的結果是1,所以當然判斷它為Fixnum。

※Ruby的算術

接下來提幾個基本的數學除法運算,還記得國小數學老師就有教,除以零是沒有意義的,做答請回答「無意義」,我們看看Ruby怎麼處理除以零的問題:

有點酷,明明都是除以0,卻有三種不同的結果!整數的跟小學老師教的一樣,不可以做沒意義的事,所以出Error,但是另外兩種就很神奇,書中只說0.0/0.0是一個特例,而另外9.2/0有無窮大的的結果(?)是說書中有提到浮點數除以0是不會報錯的,只會傳回Infinity,很想知道原因,這部分我還需要再查查資料、做做功課才能理解,之後懂了再補上來!

最後再來簡介幾個書中提到的算術例子給大家參考:

打到這裡突然又想到,所有比20位還多的整數都是Bignum嗎?沒有範圍嗎?所以做了以下測試:

當數字太大,系統會跟你警告!這太大了噢!然後跟你說這已經是Infinity無窮大的數了,這時候檢查他的類別,當他大到無窮大時,他就不是屬於Bignum的類別,而是Float浮點數了!酷XD!數字真有趣XD

=================================================

今天只有介紹完數字,還留下了一些問題Orz,大概自己是數學老師,所以對數學有點偏執吧,這裡的疑惑好像都不是什麼重要的疑惑啊XD"之後會想辦法再弄更清楚的!

If it ain't fun, don't do it.

今天想說,如果這件事不好玩,就不要做了!我繼續寫下去,是因為我覺得這很好玩:D!


上一篇
Ruby女孩(4):Ruby的語彙結構簡介
下一篇
Ruby女孩(6):Ruby的"-字-字-字-字-字-"
系列文
Ruby女孩:10萬.times { puts "為什麼?" }30

尚未有邦友留言

立即登入留言