Python3 math.ulp()方法 - 求浮点数的最小有效比特位
描述
math.ulp(x)方法返回给定浮点数的最小单位。
这个单位是指在给定浮点数的范围内,两个相邻的浮点数之间的差值。
例如,对于输入值3.1415926,math.ulp(x)将返回2.220446049250313e-16。
这意味着在3.1415926的范围内,相邻的两个浮点数之间的差值为2.220446049250313e-16。
语法
math.ulp()方法语法如下:
math.ulp(x)
参数说明:
- x -- 必需,一个数字
返回值
- 如果 x 是 NaN (非数字),则返回 x。
- 如果 x 为负数,则返回 ulp(-x)。
- 如果 x 为正数,则返回 x。
- 如果 x 等于零,则返回 去正规化的 可表示最小正浮点数 (小于 正规化的 最小正浮点数 sys.float_info.min)。
- 如果 x 等于可表示最大正浮点数,则返回 x 的最低有效比特位的值,使得小于 x 的第一个浮点数为 x - ulp(x)。
- 在其他情况下 (x 是一个有限的正数),则返回 x 的最低有效比特位的值,使得大于 x 的第一个浮点数为 x + ulp(x)。
实例
以下实例返回指定数字的精度:
import math
x = 1.0
p = 0
while x != x + 1:
x = x * 2
p = p + 1
print(f"当前x的值:{x},当前x的循环次数{p},当前x的精度{math.ulp(x)}")
输出结果:
当前x的值:2.0,当前x的循环次数1,当前x的精度4.440892098500626e-16
当前x的值:4.0,当前x的循环次数2,当前x的精度8.881784197001252e-16
当前x的值:8.0,当前x的循环次数3,当前x的精度1.7763568394002505e-15
当前x的值:16.0,当前x的循环次数4,当前x的精度3.552713678800501e-15
当前x的值:32.0,当前x的循环次数5,当前x的精度7.105427357601002e-15
当前x的值:64.0,当前x的循环次数6,当前x的精度1.4210854715202004e-14
当前x的值:128.0,当前x的循环次数7,当前x的精度2.842170943040401e-14
当前x的值:256.0,当前x的循环次数8,当前x的精度5.684341886080802e-14
当前x的值:512.0,当前x的循环次数9,当前x的精度1.1368683772161603e-13
当前x的值:1024.0,当前x的循环次数10,当前x的精度2.2737367544323206e-13
当前x的值:2048.0,当前x的循环次数11,当前x的精度4.547473508864641e-13
当前x的值:4096.0,当前x的循环次数12,当前x的精度9.094947017729282e-13
当前x的值:8192.0,当前x的循环次数13,当前x的精度1.8189894035458565e-12
当前x的值:16384.0,当前x的循环次数14,当前x的精度3.637978807091713e-12
当前x的值:32768.0,当前x的循环次数15,当前x的精度7.275957614183426e-12
当前x的值:65536.0,当前x的循环次数16,当前x的精度1.4551915228366852e-11
当前x的值:131072.0,当前x的循环次数17,当前x的精度2.9103830456733704e-11
当前x的值:262144.0,当前x的循环次数18,当前x的精度5.820766091346741e-11
当前x的值:524288.0,当前x的循环次数19,当前x的精度1.1641532182693481e-10
当前x的值:1048576.0,当前x的循环次数20,当前x的精度2.3283064365386963e-10
当前x的值:2097152.0,当前x的循环次数21,当前x的精度4.656612873077393e-10
当前x的值:4194304.0,当前x的循环次数22,当前x的精度9.313225746154785e-10
当前x的值:8388608.0,当前x的循环次数23,当前x的精度1.862645149230957e-09
当前x的值:16777216.0,当前x的循环次数24,当前x的精度3.725290298461914e-09
当前x的值:33554432.0,当前x的循环次数25,当前x的精度7.450580596923828e-09
...
当前x的值:1125899906842624.0,当前x的循环次数50,当前x的精度0.25
当前x的值:2251799813685248.0,当前x的循环次数51,当前x的精度0.5
当前x的值:4503599627370496.0,当前x的循环次数52,当前x的精度1.0
当前x的值:9007199254740992.0,当前x的循环次数53,当前x的精度2.0