如何计算取值范围为[0.0,1.0)的浮点数小数部分?
计算符合数学定义的浮点数小数部分:Python原生函数是否存在?
计算浮点数x的小数部分f时,常规方法依赖_, f = divmod(x, 1.0)或f = x % 1.0,这种方法对多数数值有效,但并非适用于所有情况。
例如:
import math x = -math.ulp(0.49999999999999994) (k, f) = divmod(x, 1.0) # 结果为 k = -1.0,f = 1.0
在数值有限表示导致的不精确计算约束下,divmod的计算是符合预期的,但得到的f并不是x真正的小数部分——数学上不允许小数部分取值为1.0。因此当需要计算符合严格数学定义的小数部分时,原生的divmod或%并不是合适的工具。
手动解决方案1
f = (x % 1.0) % 1.0 k = round(x - f)
手动解决方案2(补丁法)
import math (k, f) = divmod(x, 1.0) if 1.0 == f: f -= math.ulp(1.0)
手动解决方案3(高精度尝试)
注:math.ulp(1.0) / 2.0 != math.ulp(0.49999999999999994)
import math (k, f) = (0.0, 0.0) if x <= -math.ulp(1.0): (k, f) = divmod(x, 1.0) elif x < -math.ulp(1.0) / 2.0: (k, f) = (-1.0, 1.0 - math.ulp(1.0)) elif x < 0.0: (k, f) = (0.0, 0.0) else: (k, f) = divmod(x, 1.0)
是否存在Python原生函数,能实现上述手动方案所定义的真正小数部分计算?
内容的提问来源于stack exchange,提问作者Philippe Thévenaz
相关产品推荐
相关产品推荐

