簡體   English   中英

在數學計算中看不到Python的近似值

[英]Unable to see Python's approximations in mathematical calculations

問題:查看當我使用Python時計算機何時對數學計算進行近似

問題示例:

我的老老師曾經說過以下話

You cannot never calculate 200! with your computer. 

我現在不能完全確定這是否正確。 似乎是這樣,因為我從Python腳本獲得了很多零。

您如何看待您的Python代碼何時近似?

Python使用任意精度算術來計算整數,因此它可以精確計算200!。 對於實數(所謂的浮點數 ),Python不使用精確的表示形式。 它使用一種稱為IEEE 754的二進制表示形式,本質上是科學計數法,只是用2代替10。

因此,任何不能以53位精度在基數2中精確表示的實數,Python都無法產生精確的結果。 例如,0.1(以10為底)是以2為底的無限小數0.0001100110011 ...,因此無法精確表示。 因此,如果您在Python提示符下輸入:

>>> 0.1
0.10000000000000001

返回的結果是不同的,因為已經從十進制轉換為二進制(精度為53位),再轉換為十進制。 結果,您得到這樣的事情:

>>> 0.1 + 0.2 == 0.3
False

要獲得良好(但很長)的閱讀內容,請參閱每個程序員應該了解的有關浮點運算的知識

Python具有類型形式的無限制的整數大小。 也就是說,如果是整數,則該數字大小的限制受Python可用內存的限制。

當您計算大量數字(例如200)時! 並且在它的末尾看到一個L,這意味着Python自動將int強制轉換為long ,因為int不足以容納該數字。

有關更多信息,請參見本頁 6.4。

請參閱在Python中處理非常大的數字

Python有一個BigNum類可容納200個! 並將自動使用它。

您老師的陳述,盡管此處並非完全正確,但通常是正確的。 計算機有局限性,很高興知道它們是什么。 請記住,每次添加另一個數據存儲整數時,您可以存儲的數字是2 ^ 32(40億+)倍。 很難理解還有多少個數字-但是隨着您添加更多的整數來存儲一個非常大的數字的精確值,數學運算會變慢。

作為示例(可以存儲1000位的內容)

>>> 2 << 1000
2143017214372534641896850098120003621122809623411067214887500776740702102249872244986396
7576313917162551893458351062936503742905713846280871969155149397149607869135549648461970
8421492101247422837559083643060929499671638825347975351183310878921541258291423929553730
84335320859663305248773674411336138752L

我試圖說明一個數字可以存儲10000位,甚至8,000,000位(兆字節),但是這個數字長很多頁。

200! 確實是一個很大的數字。

如果IEEE 64位double的范圍是1.7E +/- 308(15位數字),則可以看到最大可析因數約為170!。

Python可以處理任意大小的數字,帶有BigInteger的Java也可以處理。

如果對該聲明不做任何澄清,那顯然是錯誤的。 僅憑個人經驗,編程的早期課程(在1980年代末期)就包括解決非常相似(甚至不完全相同)的問題。 通常,要知道某些進行計算的設備不是近似值,則必須證明(從數學上來說是證明)不是。

Python的整數類型(在2.x中被命名為intlong ,在3.x中都被折疊成int類型)非常好,並且不會像C中的int類型那樣溢出。 print 200 * 199 * 198 * ...可能會很慢,但會准確無誤。 類似地,加,減和模量是精確的。 除法是一個混合包,因為有兩個運算符/// ,並且它們在2.x中進行了更改-通常,您只能將其視為不精確。

如果您想要更多控制權但又不想將自己限制為整數,請查看decimal模塊。

Python自動處理大數(不同於像C這樣的語言,在C中,您可能會溢出其數據類型並將值重置為零)-在某個點( sys.maxint或2147483647)上,它將整數轉換為“ long”(表示為由數字后面的L表示),可以是任意長度:

>>> def fact(x):
...     return reduce(lambda x, y: x * y, range(1, x+1))
... 
>>> fact(10)
3628800
>>> fact(200)
788657867364790503552363213932185062295135977687173263294742533244359449963403342920304284011984623904177212138919638830257642790242637105061926624952829931113462857270763317237396988943922445621451664240254033291864131227428294853277524242407573903240321257405579568660226031904170324062351700858796178922222789623703897374720000000000000000000000000000000000000000000000000L

長數字是“容易的”,浮點數更復雜,並且浮點數的幾乎任何計算機表示形式都是近似值,例如:

>>> float(1)/3
0.33333333333333331

顯然,您不能在內存中存儲無限數量的3,因此它會作弊並四舍五入。

您可能要看一下十進制模塊:

  • 小數可以精確表示。 相反,像1.1這樣的數字在二進制浮點數中沒有確切的表示形式。 最終用戶通常不希望1.1像二進制浮點那樣顯示為1.1000000000000001。
  • 與基於硬件的二進制浮點數不同,十進制模塊具有用戶可更改的精度(默認為28位),該精度可以與給定問題所需的精度一樣大

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM