程式者的胡言亂語

pageicon 星期一 四月 10, 2006

新的浮點數基礎型別-decimal

C#Java一樣,都支援了floatdouble這兩種浮點數的基礎型別。這兩種浮點數的型式皆為A*Base^Exp,其中A是浮點數的尾數(mantissa),Base是基底,而Exp則是指數部份。這意謂該浮點數的值為A乘上基底的Exp次方。關於浮點數的設計,於數值方法或數值分析的課程中皆會探討,本處則不必細言。透過上次的設計雖然可以表示極大範圍的實數,但是由於實數是連續的,其實有無限多個,所以無論如何以數位的方式表示實數,都有其極限。當利用浮點數來表示某個實數時,若該浮點數表示法無法表示時,會進行進位(rounding)的動作,進位後難免產生誤差(rounding error)。尤其人皆採十進位思考運算,但floatdouble皆以2為基底,可想而知的是,透過這種方式來表示浮點數,會有許多看起來以十進位可以表示的小數,以2為基底時卻發生了進位誤差。C#引入了一個名為decimal的型別,而decimal型別存在的最大原因就是要降低進位誤差,因為它的基底採取的是10而非2。請參考下例:


                double d = 0.12345678901234567890123456789;


                                decimal m = 0.12345678901234567890123456789m;


                                Console.WriteLine(d);


                                Console.WriteLine(m);


其中decimal m行宣告了一個decimal型別的變數,而之後的0.12345678901234567890123456789數值常數後加上m(也可寫成M),是在C#中用來表示該常數為decimal型別之用。如同float常數需加上d(也可寫成D)一般。在這個例子中,dm皆被指派了相同的常數值,但實際印出的結果卻如下:


0.123456789012346


0.1234567890123456789012345679


兩個數值都發生了進位的誤差,但可以觀察出以decimal型別表示十進位的數字,其進位誤差小多了。而降低進位誤差的代價,就是付出(也同時浪費)儲存的空間,以及運算的速度。

pageicon 星期日 四月 09, 2006

基礎型別

基礎型別


 


Java的整數數值基礎型別包括:byteshortintlong,這些型別有儘管所能表示的整數範圍不同,但都具備一個共通的特性,就是它們皆為有號數(signed number)。但在C#中卻將有號數與無號數拆開,分別以不同的型別名稱來表示。它們的對應關係如下表所示:
























Java


C#有號數


C#無號數


byte


sbyte


Byte


short


short


ushort


int


int


Uint


long


long


ulong


 


例如在Java中的byte表示-128127之間的所有整數,但在C#中的byte表示的卻是0-255之間的所有整數,而C#中的sbyte表示的才是-128127之間的所有整數。


個人認為C#的命名系統出現些微不一致的情況。因為有些型別(sbyte)是冠上s表示有號(signed),而有些型別(ushortuintulong)是冠上u表示無號(unsigned),發生了不一致的情況。不過這個情形合理的解釋就是byteMicrosoftC/C++型別慣例中,原先就是代表無號的型別,而shortintlong;都是有號的型別,因此才會採取如此的修飾方法。


那為什麼C#對有號無號做出區別呢?在C/C++中,都有無號與有號的設計,為什麼Java的設計者會捨棄無號數,而只納入有號數呢?我個人傾向於認為這是Java一貫的哲學。即使多提供一些語法上的元素,可以增加程式員運用時的彈性與威力,但是Java的設計總是希望保留最常被用到的元素,捨棄那些鮮少被使用,或可以被其他元素替代的元素,這麼一來,可以保持Java的單純性。如C++就是一個例子,C++提供很多powerful的寫法,但是卻增加了語言本身的難度與複雜性,拉高了程式員的學習曲線,也增加了程式員因為對語法不熟悉而產生的程式瑕疵。Java號稱C++--就是根源自這個原因。不過看起來C#仍舊重新接納許多C++中的特性(往後還會再提到),這使得C#雖然繼承Java而來,但仍舊得面臨許多C++的毛病與問題。

把對母乳媽媽的感謝與支持傳出去

« 十一月 2008
星期日星期一星期二星期三星期四星期五星期六
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
21
22
23
24
25
26
27
28
29
30
      
今日

Search this blog

Links

Weblog menu

Today's referrers

Feeds