Skip to content

#4 數字家族

整數 int

四則運算

整數可以使用的加減乘除分別為+,-,*,/

>>> print(1+10)
>>> print(1-10)
>>> print(1*10)
>>> print(1/10)
11
-9
10
0.1
其中需要特別注意的是除法/,當兩個整數相除的時候,無論是否整除,都會讓型別轉換成浮點數float
>>> print(type(100))
>>> print(type(100/10))
<class 'int'>
<class 'float'>
還有就是小朋友都知道的,請不要除以零,世界會毀滅

Failure

>>> 1/0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

已知:100 除以 30 等於 3 (商數) 餘 10 (餘數)

如果希望只保留商數,可以使用//

>>> print(type(100//30))
>>> print(100//30)
<class 'int'>
3

如果希望只保留商數,可以使用%

>>> print(type(100%30))
>>> print(100%30)
<class 'int'>
10

除了四則運算外,還有一個指數運算子**

\(10^2\) 可以寫成 10**2

不像常見的int被設定為32/64位元,Python的整數沒有大小上限,或者說大小上限取決於你的機器有多少記憶體

print(10**1234)

10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Python 是隱式、動態、強型別的語言(Implicit, Dynamic, Strong)。 下面這個語句在javascript中是合法的 但因為Python強型別的特性,會拋出一個錯誤

Failure

>>> 1+"1"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'

但整數和浮點數是可以加起來的

print(1+1.1)

2.1

浮點數 float

正規化

當數字包含小數點的時候,便會使用浮點數儲存。

>>> print(type(123))
>>> print(type(123.0))
<class 'int'>
<class 'float'>

浮點數的儲存方式是使用類似科學記號的表示方法

舉例:

\(123.456 = 1.23456 \times 10^2\)

當寫成 \(a \times 10^b\) 時,a稱為mantissa,b稱為exponent

Python的float使用了IEEE754的double precision floating point,他會將數字表示為 \(a \times 2^b\) 用52bits儲存a,用11bits儲存b,最後用1bit儲存正負號。

根據一番大家想要忽略的計算,可以求的他的最大值為 \((2 - 2^{-52}) \times 2 ^ {1023}\)

>>> import sys
>>> print((2-2**(-52)) * 2 ** 1023)
>>> print(sys.float_info.max)
1.7976931348623157e+308
1.7976931348623157e+308

特殊成員 infnan

浮點數除了普通數字以外,還有正負無限大可以用

>>> import math
>>> print(math.inf)
>>> print(float("inf"))
>>> print(math.inf==float("inf"))
>>> print(math.inf + 100)
inf
inf
True
inf

除了inf-inf外,還有一個nan,代表Not a Number`,通常用來表示算出奇怪的東西

>>> import math
>>> print(math.inf-math.inf) #wtf??
nan

要注意nan是具有傳染性的,任何運算只要包含nan,都會變成nan

>>> import math
>>> print(math.nan)
>>> print(10+math.nan)
>>> print(10-math.nan)
>>> print(10*math.nan)
>>> print(10/math.nan)
>>> print(10**math.nan)
>>> print(10%math.nan)
nan
nan
nan
nan
nan
nan
nan

最可怕的是,nan和自己不相等

>>> import math
>>> print(math.nan)
>>> print(math.nan==math.nan)
nan
False

所以當判斷是否有nan的時候,請用

>>> import math
>>> print(math.nan)
>>> print(math.isnan(math.nan))
nan
True

浮點數誤差

Warning

>>> print(0.1+0.2==0.3)
>>> print(0.1+0.2)
False
0.30000000000000004

燈愣!!! 難道Python也有bug嗎?不,這都是他的特色。

由於版面不夠(我也懶得寫),請見官方連結: https://docs.python.org/zh-tw/3.12/tutorial/floatingpoint.html#tut-fp-issues

有理數 Fraction

有理數不一定有道理,無理數也未必無理取鬧。其實rational number的rational指的是 ratio + nal,即「可以寫成比值(ratio)」的數字。當一個數字可以寫成比值的時候,他就是一個分數囉。

Fraction需要傳入的argument有兩個,第一個代表分子,第二個代表分母

計算 \(0.1+0.2 = \frac{1}{10} + \frac{2}{10}\)

>>> from fractions import Fraction
>>> print(Fraction(1,10)+Fraction(2,10))
3/10