Есть ли более эффективный способ обернуть float?

#c #performance #math #while-loop #floating-point

#c #Производительность #математика #цикл while #с плавающей запятой

Вопрос:

Я искал примеры того, как обернуть число с плавающей запятой между двумя числами, аналогично тому, как вы можете сделать с целыми числами, используя модуль. Примеры, которые я нашел, либо включают использование fmod, чтобы просто найти остаток после десятичной запятой, предполагая, что это для круга, и выполнение математики на основе числа пи, среди прочего, которые не совсем делали то, что мне было нужно. Наконец, я только что написал это:

 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.

Комментарии:

1. Более быстрый способ сделать это без циклов — использовать fmod() .

2. «это не совсем то, что мне нужно», вы должны описать, что вам нужно.

3. Я пробовал использовать fmod() , но, похоже, он возвращает данные только после десятичной запятой, по крайней мере, судя по моим тестам. У вас есть пример того, как его использовать в этом случае?

4. Что касается того, что мне нужно, мне нужно, чтобы в основном сделать так, чтобы, когда float выходит за пределы определенного диапазона, он оборачивался на другую сторону, например, если спрайт исчезает с экрана, он возвращался на другую сторону.

5. Я не понимаю, что не так a0 fmod(x, a1 - a0) в общем случае.

Ответ №1:

Есть ли более эффективный способ обернуть float?

Используйте 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);
}
  

Комментарии:

1. Это почти то, что мне было нужно. Он работает достаточно хорошо для положительных чисел, однако, когда x отрицательно, он ломается. Мне пришлось проверить знак и использовать return a1 fmod(x, diff); , если x было отрицательным.

2. @KelvinShadewing Вы можете отредактировать этот ответ, чтобы включить этот вывод.

3. Почему-то я не заметил, что вы можете редактировать ответы других людей. XD Спасибо.

4. @KelvinShadewing Не mn mx определено nor…

5. @KelvinShadewing сообщество wiki ответы предназначены для тщательного редактирования любым пользователем. И с более высокой репутацией вы можете редактировать вопросы и ответы других пользователей.