C++ 有没有更有效的方法来包装浮动?

C++ 有没有更有效的方法来包装浮动?,c++,performance,math,while-loop,floating-point,C++,Performance,Math,While Loop,Floating Point,我一直在寻找如何在两个数字之间包装一个浮点数的例子,类似于使用模处理整数的方法。我发现的例子包括使用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) n

我一直在寻找如何在两个数字之间包装一个浮点数的例子,类似于使用模处理整数的方法。我发现的例子包括使用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

有没有更有效的方法来包装浮动

使用fmod族

有没有更有效的方法来包装浮动

使用fmod族


没有循环的更快方法是使用fmod。这并不能完全满足我的需要,你应该描述你需要什么。我尝试过使用fmod,但它似乎只返回小数点后的内容,至少通过我的测试是这样的。你有没有一个例子说明如何在这种情况下使用它?至于我需要什么,我需要它基本上使它,当一个浮点数超出一定范围时,它会绕到另一边,例如,如果一个精灵离开屏幕,它会回到另一边。我不知道a0+fmodx有什么问题,a1-a0在一般情况下。不使用循环的更快方法是使用fmod。这并不能完全满足我的需要,你应该描述你需要什么。我尝试过使用fmod,但它似乎只返回小数点后的内容,至少通过我的测试是这样的。你有没有一个例子说明如何在这种情况下使用它?至于我需要什么,我需要它基本上使它,当一个浮点数超出一定范围时,它会绕到另一边,例如,如果一个精灵离开屏幕,它会回到另一边。我不知道a0+fmodx有什么问题,一般情况下是a1-a0。这几乎是我所需要的。它对正数足够有效,但是,当x为负数时,它会中断。我必须检查标志并使用返回a1+fmodx,diff;如果x为负。@KelvinShadewing您可以编辑此答案以包含该发现。不知何故,我没有注意到您可以编辑其他人的答案。XD谢谢。@KelvinShadewing没有定义mn或mx…@KelvinShadewing社区维基答案供任何人仔细编辑。有了更高的代表性,你可以编辑其他人的问答。这几乎是我所需要的。它对正数足够有效,但是,当x为负数时,它会中断。我必须检查标志并使用返回a1+fmodx,diff;如果x为负。@KelvinShadewing您可以编辑此答案以包含该发现。不知何故,我没有注意到您可以编辑其他人的答案。XD谢谢。@KelvinShadewing没有定义mn或mx…@KelvinShadewing社区维基答案供任何人仔细编辑。有了更高的代表,你可以编辑其他人的问答。
#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);
}