contents
related file
- cpython/Objects/floatobject.c
- cpython/Include/floatobject.h
- cpython/Objects/clinic/floatobject.c.h
memory layout
PyFloatObject is simply a wrapper around the C type double, which takes 8 bytes to represent a floating-point number
you can refer to IEEE 754/IEEE-754标准与浮点数运算 for more detail
example
0
The binary representation of 0.0 in IEEE 754 format is 64 zero bits
1.0
0.1
1.1
The difference between 1.1 and 0.1 is the last few exponent bits
-0.1
The difference between -0.1 and 0.1 is the first sign bit
free_list
#ifndef PyFloat_MAXFREELIST #define PyFloat_MAXFREELIST 100 #endif static int numfree = 0; static PyFloatObject *free_list = NULL;
free_list is a singly linked list that stores at most PyFloat_MAXFREELIST PyFloatObjects
The linked list is linked via the ob_type field
>>> f = 0.0 >>> id(f) 4551393664 >>> f2 = 1.0 >>> id(f2) 4551393616 del f del f2
f3 comes from the head of the free_list
>>> f3 = 3.0 >>> id(f3) 4551393616








