首页 > 解决方案 > 有没有更有效的方法来包装浮点数?

问题描述

我一直在寻找有关如何在两个数字之间包装浮点数的示例,类似于如何使用模数处理整数。我发现的示例涉及使用 fmod 来查找小数点后的余数,假设它是一个圆圈并进行基于 pi 的数学运算,以及其他一些并不能完全满足我需要的事情。最后,我只是写了这个:

float fwrap(float x, float a0, float a1)
{
    float mx = max(a0, a1);
    float mn = min(a0, a1);
    float nw = x;

    while(nw < mn) nw += mx - mn;
    while(nw > mx) nw -= mx - mn;
};

它有效,但我确定如果原始值离范围太远,它会慢慢思考,那么有没有更快的方法来做到这一点而不涉及循环?

我需要做的就是在超出范围时将一个数字包装在一个范围内,例如,如果a0是 10 并且a1是 20,那么如果x是 25,它应该返回 15,但它也应该与浮点数一起使用,所以如果x是 8.5,它应该返回 18.5。

标签: c++performancemathwhile-loopfloating-point

解决方案


有没有更有效的方法来包装浮点数?

使用fmod()家庭。

#include <float.h>

float fwrap_alternate(float x, float min, float max) {
    if (min > max)
        return fwrap_alternative(x, max, min);
    return (x >= 0 ? min : max) + fmodf(x, max - min);
}

推荐阅读