程式者的胡言亂語
- 全部
- Networking
- Travel
- Win32
- 黑米蟲
- programming
- DirectShow
- 書評
- 吃吃喝喝
- 站在Java的肩膀上看C#
- 音樂和電影
- General
- Java
新的浮點數基礎型別-decimal
C#與Java一樣,都支援了float與double這兩種浮點數的基礎型別。這兩種浮點數的型式皆為A*Base^Exp,其中A是浮點數的尾數(mantissa),Base是基底,而Exp則是指數部份。這意謂該浮點數的值為A乘上基底的Exp次方。關於浮點數的設計,於數值方法或數值分析的課程中皆會探討,本處則不必細言。透過上次的設計雖然可以表示極大範圍的實數,但是由於實數是連續的,其實有無限多個,所以無論如何以數位的方式表示實數,都有其極限。當利用浮點數來表示某個實數時,若該浮點數表示法無法表示時,會進行進位(rounding)的動作,進位後難免產生誤差(rounding error)。尤其人皆採十進位思考運算,但float與double皆以2為基底,可想而知的是,透過這種方式來表示浮點數,會有許多看起來以十進位可以表示的小數,以2為基底時卻發生了進位誤差。C#引入了一個名為decimal的型別,而decimal型別存在的最大原因就是要降低進位誤差,因為它的基底採取的是10而非2。請參考下例:
double d = 0.12345678901234567890123456789;
decimal m =
Console.WriteLine(d);
Console.WriteLine(m);
其中decimal m行宣告了一個decimal型別的變數,而之後的0.12345678901234567890123456789數值常數後加上m(也可寫成M),是在C#中用來表示該常數為decimal型別之用。如同float常數需加上d(也可寫成D)一般。在這個例子中,d與m皆被指派了相同的常數值,但實際印出的結果卻如下:
0.123456789012346
0.1234567890123456789012345679
兩個數值都發生了進位的誤差,但可以觀察出以decimal型別表示十進位的數字,其進位誤差小多了。而降低進位誤差的代價,就是付出(也同時浪費)儲存的空間,以及運算的速度。
Posted at 06:13下午 四月 10, 2006 by Chien-Hsing Wang in 站在Java的肩膀上看C# | 迴響[1]
基礎型別
基礎型別
Java的整數數值基礎型別包括:byte、short、int、long,這些型別有儘管所能表示的整數範圍不同,但都具備一個共通的特性,就是它們皆為有號數(signed number)。但在C#中卻將有號數與無號數拆開,分別以不同的型別名稱來表示。它們的對應關係如下表所示:
Java | C#有號數 | C#無號數 |
byte | sbyte | Byte |
short | short | ushort |
int | int | Uint |
long | long | ulong |
例如在Java中的byte表示-128~127之間的所有整數,但在C#中的byte表示的卻是0-255之間的所有整數,而C#中的sbyte表示的才是-128~127之間的所有整數。
個人認為C#的命名系統出現些微不一致的情況。因為有些型別(sbyte)是冠上s表示有號(signed),而有些型別(ushort、uint、ulong)是冠上u表示無號(unsigned),發生了不一致的情況。不過這個情形合理的解釋就是byte在Microsoft的C/C++型別慣例中,原先就是代表無號的型別,而short、int、long;都是有號的型別,因此才會採取如此的修飾方法。
那為什麼C#對有號無號做出區別呢?在C/C++中,都有無號與有號的設計,為什麼Java的設計者會捨棄無號數,而只納入有號數呢?我個人傾向於認為這是Java一貫的哲學。即使多提供一些語法上的元素,可以增加程式員運用時的彈性與威力,但是Java的設計總是希望保留最常被用到的元素,捨棄那些鮮少被使用,或可以被其他元素替代的元素,這麼一來,可以保持Java的單純性。如C++就是一個例子,C++提供很多powerful的寫法,但是卻增加了語言本身的難度與複雜性,拉高了程式員的學習曲線,也增加了程式員因為對語法不熟悉而產生的程式瑕疵。Java號稱C++--就是根源自這個原因。不過看起來C#仍舊重新接納許多C++中的特性(往後還會再提到),這使得C#雖然繼承Java而來,但仍舊得面臨許多C++的毛病與問題。
Posted at 05:42下午 四月 09, 2006 by Chien-Hsing Wang in 站在Java的肩膀上看C# |
星期一 四月 10, 2006
