数值(数字)

数值(Python中称为数字)包括整型和浮点型,是最常用的基本数据类型之一。[大谦MATLAB,dqmatlab点com]

整型数值(数字)

【MATLAB】

MATLAB中的整型数据类型可以定义一定范围内的整型值。例如,int8型数据可以表示—128~127的任何8位无符号整数。该数据类型在保存只能用整型保存的数据(例如图像数据)时很有用。表2-4列出了各种整型数据类型的取值范围。

表2-4 MATLAB中的整型数据类型及其值的范围

数 据 类 型 描 述 值 的 范 围
int8 有符号8位整数 128~127
uint8 无符号8位整数 0~255
int16 有符号16位整数 215~2151
uint16 无符号16位整数 0~2161
int32 有符号32位整数 231~2311
uint32 无符号32位整数 0~2321
int64 有符号64位整数 263~2631
uint64 无符号64位整数 0~2641

使用整型数值类型名称对应的函数,可以将值或变量转换为整型。在命令窗口中输入

code.matlab
>> x=int8(5)

将x的值设置为5,数据类型设置为int8型。可以用class函数确认变量的数据类型。例如:

code.matlab
>> class(x)
ans=
'int8'

【Python】

整型数字没有小数点,可有正负之分。Python 3中的整型没有短整型和长整型之分。

code.python
>>> a=10
>>> a
10
>>> b=-100
>>> b
-100

Python中整型值没有大小限制,可以表示很大的数,不会溢出,例如:

code.python
>>> c=99999999999999999999999
>>> c
99999999999999999999999

为了提高代码的可读性,可以给数字增加下划线作为分隔符,例如:

code.python
>>> d=123_456_789
>>> d
123456789

可以用十六进制或八进制表示整数。常用十六进制整数表示颜色,比如可用0x0000FF表示红色:

code.python
>>> e=0x0000FF
>>> e
255

浮点型数值(数字)

【MATLAB】

默认时,MATLAB指定数据为double型,表示64位的双精度浮点型。MATLAB用双精度计算操作double型数据。对大部分数值计算任务而言,推荐使用double型。

下面在命令窗口中给变量a赋值3,用class函数查看变量a的数据类型。

code.matlab
>> a=3
a =
     3
>> class(a)
ans =
    'double'

可见,变量a的数据类型为double型,即MATLAB默认的数值类型是double型。

除双精度浮点型外,数值变量还有单精度浮点型,即single型。

下面用single命令将数值或变量指定为single型。在命令窗口中输入

code.matlab
>> a=single(5)

将a的值设置为5,数据类型设置为single型。

将数据保存为single型时所需要的内存只占保存为double型时的一半。可以用whos命令进行比较,例如:

code.matlab
>> b=5;
>> whos
Name      	Size          	Bytes    	Class
a         	11          	4        	single
b         	11          	8        	double

函数eps返回浮点数的精度。所谓精度,指的是该浮点数与下一个浮点数之间的差值。例如:

code.matlab
>> format long
>> eps(5)
ans=
    8.881784197001252e-16

其中,format命令设置变量的输出格式为小数点后面保留15位小数。

【Python】

Python 3中,浮点型数字没有单精度浮点型和双精度浮点型之分。浮点型数字带小数,可以有十进制和科学计数法两种表示形式。比如31.415这个浮点数可以表示为:

code.python
>>> a=31.415
>>> a
31.415

code.python
>>> a=3.1415e1
>>> a
31.415

注意,科学计数法返回的数字是浮点型的,即使字母e前面是整数也是这样。

code.python
>>> b=1e2  #100
>>> type(b)
<class 'float'>

整数和浮点数混合运算时,MATLAB中计算结果为整型,Python中计算结果则为浮点型。例如下面计算一个整数和一个浮点数的和:

【MATLAB】

code.matlab
>> a=int8(10);
>> b=1.123;
>> c=a+b;
>> class(c)
ans =
    'int8'

【Python】

code.python
>>> a=10
>>> b=1.123
>>> c=a+b
>>> type(c)
<class 'float'>

复数

Python支持复数。复数由实部和虚部组成,可以用a+bj或者complex(a,b)表示。复数的实部a和虚部b都是浮点型数字。

下面创建几个复数变量:

code.python
>>> a=1+2j
>>> a
(1+2j)
>>> type(a)
<class 'complex'>
>>> b=-3j
>>> b
(-0-3j)
>>> c=complex(2,-1.2)
>>> c
(2-1.2j)
>>> type(c)
<class 'complex'>

其中变量b表示的复数只有虚部,实部自动设置为0。

类型转换

【MATLAB】

使用int8, int16, single, double等函数可以将其他数值类型转换为指定的数值类型。把数值转换为一种整型数据类型时,MATLAB会将结果圆整到最近的整型值。

在命令窗口中输入

code.matlab
>> int8(2.7)
ans=
3

对于小数位为5的情况,如果数值为正,则向上圆整,否则向下圆整。

code.matlab
>> int8(2.5)
ans=
3
>> int8(-2.5)
ans=
-3

将大于整型数据类型最大值的数据转换为该整型时,MATLAB返回最大值。

code.matlab
>> int8(300)
ans=
127

同样,在转换时,如果数据值小于数据类型的最小值,则返回最小值,通常这被称为饱和溢出。

两个不同精度的数据进行运算时,先将高精度的数据转换为低精度数据,然后进行计算。

在命令窗口中输入

code.matlab
>> x=int32(5)+9.5
x=
15
>> class(x)
ans=
'int32'

其中,5是双精度浮点型的。

注意:整数只能与相同类型的整数或双精度浮点型值一起进行运算。

【Python】

Python中浮点型转换为整型时直接将小数部分去掉,而不是进行四舍五入。

code.python
>>> e=1.678    #浮点数转换为整数
>>> f=int(e)
>>> f
1
>>> type(f)
<class 'int'>

可见,浮点数1.678转换为整型数字后变成了1,小数部分直接去掉了。

Python的整数缓存机制

在命令行模式下,Python对范围在[-5,256]内的整数对象进行缓存。这些比较小的整数被使用的频率比较高,如果不进行缓存,每次使用它们的时候都要进行分配内存和释放内存的操作,会大大降低运行效率,并造成大量内存碎片。现在将它们缓存在一个小整型对象池中,能提高Python的整体性能。

下面给两个变量都赋值100,用is比较它们的内存地址。

code.python
>>> a=100
>>> b=100
>>> a is b
True

可见,它们的地址是相同的。所以,赋值100给a以后的变量,它们都指向同一个对象,而不是重新分配内存空间。

下面给两个变量都赋值500,用is比较它们的内存地址。

code.python
>>> a=500
>>> b=500
>>> a is b
False

因为500超出了[-5,256]的范围,命令行模式下Python不再提供缓存,所以a和b指向两个不同的对象。

注意:在Pycharm或者保存为文件执行时,提供缓存的数字范围更大,为[-5,任意正整数]。