Python虛擬機器中浮點數的實作原理是什麼?
Float 資料結構
在cpython 虛擬機器當中浮點數類型的資料結構定義如下所示:
typedef struct { PyObject_HEAD double ob_fval; } PyFloatObject;
上面的數據結構定義圖示如下:
在上面的資料結構當中最重要的一個欄位就是ob_fval,這個就是真實儲存浮點數的地方。
ob_refcnt 就是物件的參考計數。
ob_type 就是物件的型別。
浮點數的相關方法
建立float 物件
和我們在前面所討論到的元組和列表物件一樣,在cpython 內部實作float 類型的時候也會為float 物件做一層中間層以加快浮點數的記憶體分配,具體的相關程式碼如下所示:
#define PyFloat_MAXFREELIST 100 static int numfree = 0; static PyFloatObject *free_list = NULL;
在cpython 內部做多會快取100 個float 物件的記憶體空間,如果超過100 就會直接釋放記憶體了,這裡需要注意一點的是只用一個指標就可以將所有的float 物件快取起來,這一點是如何實現的。
這是使用在物件PyFloatObject 當中的struct _typeobject *ob_type; 這個欄位實現的,用這個欄位指向下一個float 物件的記憶體空間,因為在free_list 當中的資料並沒有使用,因此可以利用這個特點節省一些記憶體空間。下面則是建立float 物件的具體過程:
PyObject * PyFloat_FromDouble(double fval) { // 首先查看 free_list 当中是否有空闲的 float 对象 PyFloatObject *op = free_list; if (op != NULL) { // 如果有 那么就将让 free_list 指向 free_list 当中的下一个 float 对象 并且将对应的个数减 1 free_list = (PyFloatObject *) Py_TYPE(op); numfree--; } else { // 否则的话就需要申请内存空间 op = (PyFloatObject*) PyObject_MALLOC(sizeof(PyFloatObject)); if (!op) return PyErr_NoMemory(); } /* Inline PyObject_New */ (void)PyObject_INIT(op, &PyFloat_Type); // PyObject_INIT 这个宏的主要作用是将对象的引用计数设置成 1 op->ob_fval = fval; return (PyObject *) op; }
加法
下面是在cpython 當中浮點數的加法具體實現,整個過程比較簡單就是得到新的值,並且建立一個新的PyFloatObject 對象,並且將這個對象傳回。
static PyObject * float_add(PyObject *v, PyObject *w) { double a,b; CONVERT_TO_DOUBLE(v, a); // CONVERT_TO_DOUBLE 这个宏的主要作用就是将对象的 ob_fval 这个字段的值保存到 a 当中 CONVERT_TO_DOUBLE(w, b); // 这个就是将 w 当中的 ob_fval 字段的值保存到 b 当中 a = a + b; return PyFloat_FromDouble(a); // 创建一个新的 float 对象 并且将这个对象返回 }
減法
同理減法也是一樣的。
static PyObject * float_sub(PyObject *v, PyObject *w) { double a,b; CONVERT_TO_DOUBLE(v, a); CONVERT_TO_DOUBLE(w, b); a = a - b; return PyFloat_FromDouble(a); }
乘法
static PyObject * float_mul(PyObject *v, PyObject *w) { double a,b; CONVERT_TO_DOUBLE(v, a); CONVERT_TO_DOUBLE(w, b); PyFPE_START_PROTECT("multiply", return 0) a = a * b; PyFPE_END_PROTECT(a) return PyFloat_FromDouble(a); }
除法
static PyObject * float_div(PyObject *v, PyObject *w) { double a,b; CONVERT_TO_DOUBLE(v, a); CONVERT_TO_DOUBLE(w, b); if (b == 0.0) { PyErr_SetString(PyExc_ZeroDivisionError, "float division by zero"); return NULL; } a = a / b; return PyFloat_FromDouble(a); }
取反
這裡加入了一行輸出語句,這個是為了後面方便我們進行測試的。
static PyObject * float_neg(PyFloatObject *v) { printf("%.2lf 正在进行取反运算\n", v->ob_fval); return PyFloat_FromDouble(-v->ob_fval); }
求絕對值
static PyObject * float_abs(PyFloatObject *v) { printf("%.2lf 正在进行取 abs 运算\n", v->ob_fval); return PyFloat_FromDouble(fabs(v->ob_fval)); }
求 bool 值
static int float_bool(PyFloatObject *v) { printf("%.2lf 正在进行取 bool 运算\n", v->ob_fval); return v->ob_fval != 0.0; }
下圖是我們對於 cpython 對程式的修改!
下面是修改之後我們再次對浮點數進行操作的時候的輸出,可以看到的是輸出了我們在上面的程式碼當中加入的語句。
以上是Python虛擬機器中浮點數的實作原理是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

PS“正在載入”問題是由資源訪問或處理問題引起的:硬盤讀取速度慢或有壞道:使用CrystalDiskInfo檢查硬盤健康狀況並更換有問題的硬盤。內存不足:升級內存以滿足PS對高分辨率圖片和復雜圖層處理的需求。顯卡驅動程序過時或損壞:更新驅動程序以優化PS和顯卡之間的通信。文件路徑過長或文件名有特殊字符:使用簡短的路徑和避免使用特殊字符。 PS自身問題:重新安裝或修復PS安裝程序。

PS啟動時卡在“正在載入”可能是由於各種原因造成的:禁用損壞或衝突的插件。刪除或重命名損壞的配置文件。關閉不必要的程序或升級內存,避免內存不足。升級到固態硬盤,加快硬盤讀取速度。重裝PS修復損壞的系統文件或安裝包問題。查看錯誤日誌分析啟動過程中的錯誤信息。

PS打開文件時出現“正在載入”卡頓,原因可能包括:文件過大或損壞、內存不足、硬盤速度慢、顯卡驅動問題、PS版本或插件衝突。解決方法依次為:檢查文件大小和完整性、增加內存、升級硬盤、更新顯卡驅動、卸載或禁用可疑插件、重裝PS。通過逐步排查,並善用PS的性能設置,養成良好的文件管理習慣,可以有效解決該問題。

羽化控制的關鍵在於理解其漸變本質。 PS本身不提供直接控制漸變曲線的選項,但你可以通過多次羽化、配合蒙版、精細選區,靈活調整半徑和漸變柔和度,實現自然過渡效果。

文章介紹了MySQL數據庫的上手操作。首先,需安裝MySQL客戶端,如MySQLWorkbench或命令行客戶端。 1.使用mysql-uroot-p命令連接服務器,並使用root賬戶密碼登錄;2.使用CREATEDATABASE創建數據庫,USE選擇數據庫;3.使用CREATETABLE創建表,定義字段及數據類型;4.使用INSERTINTO插入數據,SELECT查詢數據,UPDATE更新數據,DELETE刪除數據。熟練掌握這些步驟,並學習處理常見問題和優化數據庫性能,才能高效使用MySQL。

PS羽化是一種圖像邊緣模糊效果,通過在邊緣區域對像素加權平均實現。設置羽化半徑可以控制模糊程度,數值越大越模糊。靈活調整半徑可根據圖像和需求優化效果,如處理人物照片時使用較小半徑保持細節,處理藝術作品時使用較大半徑營造朦朧感。但需注意,半徑過大易丟失邊緣細節,過小則效果不明顯。羽化效果受圖像分辨率影響,且需要根據圖像理解和效果把握進行調整。

MySQL性能優化需從安裝配置、索引及查詢優化、監控與調優三個方面入手。 1.安裝後需根據服務器配置調整my.cnf文件,例如innodb_buffer_pool_size參數,並關閉query_cache_size;2.創建合適的索引,避免索引過多,並優化查詢語句,例如使用EXPLAIN命令分析執行計劃;3.利用MySQL自帶監控工具(SHOWPROCESSLIST,SHOWSTATUS)監控數據庫運行狀況,定期備份和整理數據庫。通過這些步驟,持續優化,才能提升MySQL數據庫性能。

MySQL 有免費的社區版和收費的企業版。社區版可免費使用和修改,但支持有限,適合穩定性要求不高、技術能力強的應用。企業版提供全面商業支持,適合需要穩定可靠、高性能數據庫且願意為支持買單的應用。選擇版本時考慮的因素包括應用關鍵性、預算和技術技能。沒有完美的選項,只有最合適的方案,需根據具體情況謹慎選擇。
