搜尋
首頁後端開發Python教學Python虛擬機器中浮點數的實作原理是什麼?

    Float 資料結構

    在cpython 虛擬機器當中浮點數類型的資料結構定義如下所示:

    typedef struct {
        PyObject_HEAD
        double ob_fval;
    } PyFloatObject;

    上面的數據結構定義圖示如下:

    Python虛擬機器中浮點數的實作原理是什麼?

    • 在上面的資料結構當中最重要的一個欄位就是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虛擬機器中浮點數的實作原理是什麼?

    下面是修改之後我們再次對浮點數進行操作的時候的輸出,可以看到的是輸出了我們在上面的程式碼當中加入的語句。

    Python虛擬機器中浮點數的實作原理是什麼?

    以上是Python虛擬機器中浮點數的實作原理是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述
    本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
    详细讲解Python之Seaborn(数据可视化)详细讲解Python之Seaborn(数据可视化)Apr 21, 2022 pm 06:08 PM

    本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于Seaborn的相关问题,包括了数据可视化处理的散点图、折线图、条形图等等内容,下面一起来看一下,希望对大家有帮助。

    详细了解Python进程池与进程锁详细了解Python进程池与进程锁May 10, 2022 pm 06:11 PM

    本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于进程池与进程锁的相关问题,包括进程池的创建模块,进程池函数等等内容,下面一起来看一下,希望对大家有帮助。

    Python自动化实践之筛选简历Python自动化实践之筛选简历Jun 07, 2022 pm 06:59 PM

    本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于简历筛选的相关问题,包括了定义 ReadDoc 类用以读取 word 文件以及定义 search_word 函数用以筛选的相关内容,下面一起来看一下,希望对大家有帮助。

    归纳总结Python标准库归纳总结Python标准库May 03, 2022 am 09:00 AM

    本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于标准库总结的相关问题,下面一起来看一下,希望对大家有帮助。

    Python数据类型详解之字符串、数字Python数据类型详解之字符串、数字Apr 27, 2022 pm 07:27 PM

    本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于数据类型之字符串、数字的相关问题,下面一起来看一下,希望对大家有帮助。

    分享10款高效的VSCode插件,总有一款能够惊艳到你!!分享10款高效的VSCode插件,总有一款能够惊艳到你!!Mar 09, 2021 am 10:15 AM

    VS Code的确是一款非常热门、有强大用户基础的一款开发工具。本文给大家介绍一下10款高效、好用的插件,能够让原本单薄的VS Code如虎添翼,开发效率顿时提升到一个新的阶段。

    详细介绍python的numpy模块详细介绍python的numpy模块May 19, 2022 am 11:43 AM

    本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于numpy模块的相关问题,Numpy是Numerical Python extensions的缩写,字面意思是Python数值计算扩展,下面一起来看一下,希望对大家有帮助。

    python中文是什么意思python中文是什么意思Jun 24, 2019 pm 02:22 PM

    pythn的中文意思是巨蟒、蟒蛇。1989年圣诞节期间,Guido van Rossum在家闲的没事干,为了跟朋友庆祝圣诞节,决定发明一种全新的脚本语言。他很喜欢一个肥皂剧叫Monty Python,所以便把这门语言叫做python。

    See all articles

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

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

    AI Clothes Remover

    AI Clothes Remover

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

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    AI Hentai Generator

    AI Hentai Generator

    免費產生 AI 無盡。

    熱門文章

    R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
    3 週前By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.最佳圖形設置
    3 週前By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.如果您聽不到任何人,如何修復音頻
    3 週前By尊渡假赌尊渡假赌尊渡假赌

    熱工具

    SublimeText3 Mac版

    SublimeText3 Mac版

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

    PhpStorm Mac 版本

    PhpStorm Mac 版本

    最新(2018.2.1 )專業的PHP整合開發工具

    WebStorm Mac版

    WebStorm Mac版

    好用的JavaScript開發工具

    ZendStudio 13.5.1 Mac

    ZendStudio 13.5.1 Mac

    強大的PHP整合開發環境

    MinGW - Minimalist GNU for Windows

    MinGW - Minimalist GNU for Windows

    這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。