最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

python - How to compute a fractional part between 0.0 included and 1.0 excluded? - Stack Overflow

programmeradmin1浏览0评论

Naive ways to compute a fractional part f of a float number x rely on the computation of either _, f = divmod(x, 1.0) or f = x % 1.0. This works well for many numbers, but not for all. For instance:

x = -math.ulp(0.49999999999999994)
(k, f) = divmod(x, 1.0) # k = -1.0 and f = 1.0

The computation is correct and divmod does its job as advertised, under the constraints of inexact computations inherent to the finite representation of numbers. But f fails to be the fractional part of x because mathematicians do not allow a genuine fractional part to take the value 1.0. Thus, the vanilla flavor of either divmod or % is not the right tool when one desires to compute a fractional part.

Hand-Made Solution 1

f = (x % 1.0) % 1.0
k = round(x - f)

Hand-Made Solution 2 (Patch)

(k, f) = divmod(x, 1.0)
if 1.0 == f:
    f -= math.ulp(1.0)

Hand-Made Solution 3 (One attempt to be accurate)
Remark: math.ulp(1.0) / 2.0 != math.ulp(0.49999999999999994)

(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)

Does a native Python function exist that returns a genuine fractional part in the spirit of the hand-made approaches above?

发布评论

评论列表(0)

  1. 暂无评论