强基初中数学&学Python——第194课 Python内置函数详解数学篇之三:float

  class float()函数  

  返回由数字或字符串生成的浮点数。

  调用方式1:无参数,float()。

  返回浮点数0.0。

>>>print(float())

0.0

  练习题1:填写结果:

>>>print(bool(float()))

  调用方式2:整数参数,float(intNum)。

  把整数变为浮点数。

>>>print(float(1))

1.0

  练习题2:填写结果:

>>>print(1+float(1))

  Python中整数的位数不限制,但浮点数的位数是一定的,这样在转换过程中可能溢出。溢出问题后面讨论,这里讨论浮点数的忠实性——一个整数转为浮点数后再转回整数,前后两个整数相等,就称浮点数对于这个整数是忠实的。

>>>num=123456789012345

>>>print("转化前:",num)

转化前:123456789012345

  在连续增大的整数中最大的那个整数(二进制)就是浮点数最大忠实整数。最大忠实整数与sys.float_info.mant_dig(浮点数尾数二进制位数)有关。下面是推导过程。

>>>import sys

>>>sys.float_info.mant_dig

53

>>>max_int = int('1'*53,2)  #53位全是1

>>>print(max_int)

9007199254740991

  也就是说,如果超过9007199254740991,浮点数就可能不“忠实”了。

>>>int(float(9007199254740992))

9007199254740992

>>>int(float(9007199254740993))

9007199254740992

>>>int(float(-9007199254740991))

-9007199254740991

>>>int(float(-9007199254740992))

-9007199254740992

>>>int(float(-9007199254740993))

-9007199254740992

  由上面的结果,-9007199254740991也是64位浮点数的最小忠实数。这是一个16位的十进制整数,但由于16位的十进制整数中一些数已超过最大忠实数,所以sys.float_info.dig(浮点数保证忠实的十进制整数最大位数)是15。

>>>import sys

>>>sys.float_info.dig

15

  练习题3:判断64位浮点数是否能一定能忠实记录下面的整数:

A)999219786534991

B)8997199254744998

C)-9000999254740991

D)-989219986564995

  调用方式3:字符串参数,float(strNum)。

  参数strNum字符串符合下面要求:

  (1)前后可以有空格、制表符或换行符等字符(个数不限);

  (2)如有正(+)或负(-)号,正负号与数字部分不可以有空格;

  (3)数字部分可以是(不分大小写):"Infinity"或"inf"(无穷大)、“NaN”(不是一个数),及十进制整数字面值(左边可以有0)、浮点数字面值(参考上一课)。

>>>float("   \t+01_23\n  ")

123.0

>>>float("-01.23")

-1.23

>>>float(".123e-2")

0.00123

>>>float("inFinitY")

inf

>>>float("INF")

inf

>>>float("NaN")

nan

>>>float("-inFinitY")

-inf

>>>float("-NaN")

nan

>>>float("+NaN")

nan

  可见正无穷大前加负号转换后是负无穷大,NaN加正负号无作用。

  练习题4:运行下面代码,不抛出异常的填上运行结果,抛出异常的修正后运行。

>>>float("   -\t.1_23\n  ")

>>>float("infi")

?

>>>float("-nAn")

?

>>>float("\t 12_3.e+2")

?

  由于浮点数的指数和尾数的位数都是固定的,所以必然有最大正值和最小正值。最大正值在sys.float_info.max中,最小正值由sys.float_info.min_exp(最小二进制指数)和sys.float_info.epsilon(把尾数看作一个小数,它的最小值,即浮点数指数是0,除了尾数末位是1外其它都是0的值。)计算所得。下面对它们进行有关测试。

>>>import sys

>>>sys.float_info.max #最大正值

1.7976931348623157e+308

>>>float(1.7976931348623157e+308)

1.7976931348623157e+308

>>>float(1.7976931348623158e+308)

1.7976931348623157e+308

>>>float(1.7976931348623159e+308) #正无穷大表示正溢出

inf

>>>float(-1.7976931348623157e+308)

-1.7976931348623157e+308

>>>float(-1.7976931348623158e+308)

-1.7976931348623157e+308

>>>float(-1.7976931348623159e+308) #负无穷大表示负溢出

-inf

>>>sys.float_info.min_exp #指数二进制最小值

-1021

>>>sys.float_info.epsilon

2.220446049250313e-16

>>>2.220446049250313e-16*2**(-1021-1) #最小正值

5e-324

>>>float(5e-324)

5e-324

>>>float(2.5e-324)

5e-324

>>>float(2.4e-324)

0.0

>>>float(-5e-324)

-5e-324

>>>float(-2.5e-324)

-5e-324

>>>float(-2.4e-324)

-0.0

>>>float("17976931348623157"+"0"*(308-16)) #最大不溢出正整数

1.7976931348623157e+308

>>>float("17976931348623158"+"0"*(308-16))

1.7976931348623157e+308

>>>float("17976931348623159"+"0"*(308-16))

inf

>>>float("-17976931348623157"+"0"*(308-16))

-1.7976931348623157e+308

>>>float("-17976931348623158"+"0"*(308-16))

-1.7976931348623157e+308

>>>float("-17976931348623159"+"0"*(308-16))

-inf

  由上面的运行结果可以看出64位浮点数的溢出情况如下:当浮点数的绝对值大于sys.float_info.max1.7976931348623157e+308)时发生溢出;当浮点数的绝对值小于sys.float_info.epsilon*2**(sys.float_info.min_exp-1),即5e-324时,发生向0溢出。

  由于浮点数会溢出,因此在做特别大或小的浮点数的乘除、乘方和开方运算时务必要注意了。

>>>2e155*1.5e153

inf

>>>1.2e-162*2e-162

0.0

  为了避免溢出,在做绝对值远大于1或远小于1的浮点数运算时要清楚些运行步骤可能会发生溢出(结果的绝对值比原来绝对值大的操作数大很多或比原来绝对值小的操作数小很多),需要编排运算顺序避免溢出的发生。

  练习题5:写出下面的运算结果,然后拷贝运行验证。

>>>1.8e300*1.9e8/0.9e300

?

>>>1.8e300/0.9e300*1.9e8

?

>>>(1.1e-108**3)**(1/3)

?

>>>(1.1e-108**(1/3))**3

?