|
| 1 | +# float |
| 2 | + |
| 3 | +### 目录 |
| 4 | + |
| 5 | +* [相关位置文件](#相关位置文件) |
| 6 | +* [内存构造](#内存构造) |
| 7 | +* [示例](#示例) |
| 8 | + * [0](#0) |
| 9 | + * [1](#1) |
| 10 | + * [0.1](#0.1) |
| 11 | + * [1.1](#1.1) |
| 12 | + * [-0.1](#-0.1) |
| 13 | +* [free_list](#free_list) |
| 14 | + |
| 15 | +#### 相关位置文件 |
| 16 | +* cpython/Objects/floatobject.c |
| 17 | +* cpython/Include/floatobject.h |
| 18 | +* cpython/Objects/clinic/floatobject.c.h |
| 19 | + |
| 20 | +#### 内存构造 |
| 21 | + |
| 22 | +**PyFloatObject** 仅仅是一层对 c 语言中双精度浮点数的包装(**double**), 一个双精度浮点数使用8个字节去表示一个浮点数 |
| 23 | + |
| 24 | +详细的内容可以参考 [IEEE 754](https://en.wikipedia.org/wiki/IEEE_754-1985)/[IEEE-754标准与浮点数运算](https://blog.csdn.net/m0_37972557/article/details/84594879) |
| 25 | + |
| 26 | + |
| 27 | + |
| 28 | +#### 示例 |
| 29 | + |
| 30 | +##### 0 |
| 31 | + |
| 32 | +0.0 使用 **IEEE 754** 标准的表示方式为 64 个为 0 的 bit |
| 33 | + |
| 34 | + f = 0.0 |
| 35 | + |
| 36 | + |
| 37 | + |
| 38 | +##### 1.0 |
| 39 | + |
| 40 | + f = 1.0 |
| 41 | + |
| 42 | + |
| 43 | + |
| 44 | +##### 0.1 |
| 45 | + |
| 46 | + f = 0.1 |
| 47 | + |
| 48 | + |
| 49 | + |
| 50 | +##### 1.1 |
| 51 | + |
| 52 | +1.1 和 0.1 的区别是指数位最后的几个位不相同 |
| 53 | + |
| 54 | + |
| 55 | + |
| 56 | +##### -0.1 |
| 57 | + |
| 58 | +-0.1 和 0.1 的区别是第一个符号位不相同 |
| 59 | + |
| 60 | + |
| 61 | + |
| 62 | +##### free_list |
| 63 | + |
| 64 | + #ifndef PyFloat_MAXFREELIST |
| 65 | + #define PyFloat_MAXFREELIST 100 |
| 66 | + #endif |
| 67 | + static int numfree = 0; |
| 68 | + static PyFloatObject *free_list = NULL; |
| 69 | + |
| 70 | +free_list 是一个单链表, 最多存储 **PyFloat_MAXFREELIST** 个 **PyFloatObject** |
| 71 | + |
| 72 | + |
| 73 | + |
| 74 | +单链表通过 **ob_type** 字段串联起来 |
| 75 | + |
| 76 | + >>> f = 0.0 |
| 77 | + >>> id(f) |
| 78 | + 4551393664 |
| 79 | + >>> f2 = 1.0 |
| 80 | + >>> id(f2) |
| 81 | + 4551393616 |
| 82 | + del f |
| 83 | + del f2 |
| 84 | + |
| 85 | + |
| 86 | + |
| 87 | +**f3** 取自 **free_list** 的表头 |
| 88 | + |
| 89 | + >>> f3 = 3.0 |
| 90 | + >>> id(f3) |
| 91 | + 4551393616 |
| 92 | + |
| 93 | + |
0 commit comments