Numeric Types

這篇文章將介紹 Python, JavaScript, C, C# 四種程式語言的數值型別 (numeric type)。

Python

Python 的數值型別有 3 種:整數 (int)、浮點數 (float)、複數 (complex)。不過在 Python 2 中還有長整數 (long) 的數值型別,只是 long 型別在 PEP 237 的提議下 ,Python 3 的 long 已經合併為 int 型別。

int 是無限位數、無限精度 (unlimited precision) 的型別,也就是可以存放的整數沒有範圍 (極限值據說是可用的記憶體大小)。 float 是以 C 語言的 double 實作,有關浮點數的資訊可以從 sys.float_info 結構中得知,詳細內容如下表。

屬性
epsilon2.220446049250313e-16
dig15
mant_dig53
max1.7976931348623157e+308
max_exp1024
max_10_exp308
min2.2250738585072014e-308
min_exp-1021
min_10_exp-307
radix2
rounds1

complex 的實部 (real) 和虛部 (imaginary) 是 float 型別,因此 complex 的範圍就是 float 的範圍。

JavaScript

JavaScript 的數值型別只有 Number ,是 IEEE 754 的 64 位元雙精度 (double-precision) 浮點數,浮點數的定義請參考下表 Number 的屬性。雖然最近的 ECMAScript 2015 標準新增 BigInt 型別,但尚未支援各平台,建議評估後再使用。

屬性
Number.EPSILON2.220446049250313e-16
Number.MAX_SAFE_INTEGER9007199254740991
Number.MAX_VALUE1.7976931348623157e+308
Number.MIN_SAFE_INTEGER-9007199254740991
Number.MIN_VALUE5e-324
Number.NEGATIVE_INFINITY-Infinity
Number.NaNNaN
Number.POSITIVE_INFINITYInfinity

C

C 語言 (以 C99 標準) 的數值型別有 char, short int, int, long int, long long int, float, double, long double ,整數的部分都是帶正負號整數,可以加上 unsigned 變成只有正數的無號整數 (unsigned integer) ,而整數的限制範圍定義在 limits.h 標頭檔之中。

注意到整數型別只有定義「至少」幾位元,其關係是 short ≤ int ≤ long ≤ long long,實際大小依據編譯器的定義。另外,char 的範圍也是依據編譯器定義 signed 或 unsigned 而不同。

型別位元範圍
char8unsigned char: 0 to 255
signed char: -128 to 127
short int
(short)
至少 16 -32,767 to 32,767
int至少 16
(通常是 32 )
-32,767 to 32,767
long int
(long)
至少 32-2,147,483,647 to 2,147,483,647
long long int
(long long)
至少 64-9,223,372,036,854,775,807 to
9,223,372,036,854,775,807
float32±1.5 x 10−45 to ±3.4 x 1038
double64±5.0 × 10−324 to ±1.7 × 10308
long double至少和 double 相同 至少是 double 的範圍

C#

C# 的數值型別有 sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal 共 12 種。

型別位元範圍
sbyte8-128 to 127
byte80 to 255
short16-32,768 to 32,767
ushort160 to 65,535
int32-2,147,483,648 to 2,147,483,647
uint320 to 4,294,967,295
long64-9,223,372,036,854,775,808 to
9,223,372,036,854,775,807
ulong640 to 18,446,744,073,709,551,615
char16U+0000 to U+FFFF
float32±1.5 x 10−45 to ±3.4 x 1038
double64±5.0 × 10−324 to ±1.7 × 10308
decimal128±1.0 x 10-28 to ±7.9228 x 1028

總結

  • 在 C, C# 中,char 字元型別也是整數型別的一種,差別在於 C 語言是 8 位元,而 C# 是 16 位元。
  • Python 的整數型別只有 int 一種,而且 int 沒有範圍,浮點數型別也只有 float 一種。
  • JavaScript 的數值型別只有 Number 這種浮點數型別,沒有整數型別 (不過新版本有增加 BigInt)。
  • 在內建型別當中,只有 Python 有複數型別,只有 C# 有 decimal 這種浮點數型別 (精確度較高但範圍較小)。
  • C, C# 提供的數值型別最多,讓程式開發人員有最多的選擇,Python 則居於中間, 然而 JavaScript 最精簡只有一種。

提問

為什麼 Python 的整數沒有範圍?為什麼要這樣設計?

搜尋看來沒有什麼答案,也許是像 PEP 237 的提議,可以簡化程式設計需要考量範圍的因素,一切交給 Python 處理就行了。

為什麼 JavaScript 的數值型別只有浮點數型別?

推測是和 JavaScript 當時簡化的設計有關,在瀏覽器執行的程式語言盡量簡單,於是僅需要一種數值型別,就是 Number 這種浮點數型別,浮點數可以當整數使用,但整數不能當浮點數使用。我們特別要注意 JavaScript 數值的精確度問題。

如果需求超過浮點數的範圍,應該要怎麼解決比較好?

目前想到的方法是以科學記法 (scientific notation) 的方式,各自將尾數 (mantissa) 與指數 (exponent) 兩個部分獨立儲存,以整數型別各自處理計算。又或是仿照 IEEE 754 浮點數的定義設計 128 位元或更多位元的浮點數,提高精確度。

發表留言

使用 WordPress.com 設計專業網站
立即開始使用