文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python虚拟机中浮点数的实现原理是什么

2023-07-05 11:54

关注

这篇文章主要介绍“Python虚拟机中浮点数的实现原理是什么”,在日常操作中,相信很多人在Python虚拟机中浮点数的实现原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python虚拟机中浮点数的实现原理是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Float 数据结构

在 cpython 虚拟机当中浮点数类型的数据结构定义如下所示:

typedef struct {    PyObject_HEAD    double ob_fval;} PyFloatObject;

上面的数据结构定义图示如下:

Python虚拟机中浮点数的实现原理是什么

浮点数的相关方法

创建 float 对象

和我们在前面所讨论到的元组和列表对象一样,在 cpython 内部实现 float 类型的时候也会给 float 对象做一层中间层以加快浮点数的内存分配,具体的相关代码如下所示:

#define PyFloat_MAXFREELIST    100static 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();    }        (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 intfloat_bool(PyFloatObject *v){    printf("%.2lf 正在进行取 bool 运算\n", v->ob_fval);    return v->ob_fval != 0.0;}

下图是我们对于 cpython 对程序的修改!

Python虚拟机中浮点数的实现原理是什么

下面是修改之后我们再次对浮点数进行操作的时候的输出,可以看到的是输出了我们在上面的代码当中加入的语句。

Python虚拟机中浮点数的实现原理是什么

到此,关于“Python虚拟机中浮点数的实现原理是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯