某位 A 同學(xué)發(fā)了我一張截圖,問為何結(jié)果中出現(xiàn)了負(fù)數(shù)?
目前累計(jì)服務(wù)客戶數(shù)千家,積累了豐富的產(chǎn)品開發(fā)及服務(wù)經(jīng)驗(yàn)。以網(wǎng)站設(shè)計(jì)水平和技術(shù)實(shí)力,樹立企業(yè)形象,為客戶提供成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、網(wǎng)站策劃、網(wǎng)頁設(shè)計(jì)、網(wǎng)絡(luò)營銷、VI設(shè)計(jì)、網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。創(chuàng)新互聯(lián)始終以務(wù)實(shí)、誠信為根本,不斷創(chuàng)新和提高建站品質(zhì),通過對領(lǐng)先技術(shù)的掌握、對創(chuàng)意設(shè)計(jì)的研究、對客戶形象的視覺傳遞、對應(yīng)用系統(tǒng)的結(jié)合,為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進(jìn)步。看了圖,我第一感覺就是數(shù)據(jù)溢出了。數(shù)據(jù)超出能表示的大值,就會出現(xiàn)奇奇怪怪的結(jié)果。
然后,他繼續(xù)發(fā)了張圖,內(nèi)容是 print(100000*208378),就是直接打印上圖的 E[0]*G[0],結(jié)果是 20837800000,這是個正確的結(jié)果。
所以新的問題是:如果說上圖的數(shù)據(jù)溢出了,為何直接相乘的數(shù)卻沒有溢出?
由于我一直忽視數(shù)據(jù)的表示規(guī)則(整型的上限是多少?),而且對 Numpy 了解不多,還錯看了圖中結(jié)果,誤以為每一個數(shù)據(jù)都是錯誤的,所以就解答不出來。
最后,經(jīng)過學(xué)習(xí)群里的一番討論,我才終于明白是怎么回事,所以本文把相關(guān)知識點(diǎn)做個梳理。
在正式開始之前,先總結(jié)一下上圖會引出的話題:
關(guān)于第一個問題,先看看 Python 2,它有兩種整數(shù):
當(dāng)一個整數(shù)超出短整數(shù)范圍時,它會自動采用長整數(shù)表示。舉例,打印 2**100 ,結(jié)果會在末尾加字母 L 表示它是長整數(shù)。
但是到了 Python 3,情況就不同了:它僅有一種內(nèi)置的整數(shù),表示為 int,形式上是 Python 2 的短整數(shù),但實(shí)際上它能表示的范圍無限,行為上更像是長整數(shù)。無論多大的數(shù),結(jié)尾都不需要字母 L 來作區(qū)分。
也就是說,Python 3 整合了兩種整數(shù)表示法,用戶不再需要自行區(qū)分,全交給底層按需處理。
理論上,Python 3 中的整數(shù)沒有上限(只要不超出內(nèi)存空間)。這就解釋了前文中直接打印兩數(shù)相乘,為什么結(jié)果會正確了。
PEP-237(Unifying Long Integers and Integers)中對這個轉(zhuǎn)變作了說明。它解釋這樣做的 目的:
這會給新的 Python 程序員(無論他們是否是編程新手)減少一項(xiàng)上手前要學(xué)的功課。
Python 在語言運(yùn)用層屏蔽了很多瑣碎的活,比如內(nèi)存分配,所以,我們在使用字符串、列表或字典等對象時,根本不用操心。整數(shù)類型的轉(zhuǎn)變,也是出于這樣的便利目的。(壞處是犧牲了一些效率,在此就不談了)
回到前面的第二個話題:Numpy 中整數(shù)的上限是多少?
由于它是 C 語言實(shí)現(xiàn),在整數(shù)表示上,用的是 C 語言的規(guī)則,也就是會區(qū)分整數(shù)和長整數(shù)。
有一種方式可查看:
import numpy as np a = np.arange(2) type(a[0]) # 結(jié)果:numpy.int32
網(wǎng)頁標(biāo)題:Python整數(shù)與Numpy數(shù)據(jù)溢出問題解決-創(chuàng)新互聯(lián)
本文地址:http://m.rwnh.cn/article32/djiepc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、小程序開發(fā)、全網(wǎng)營銷推廣、網(wǎng)站策劃、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容