Как мне проверить, делится ли число на 2 * M_PI в c ?

#c #division #pi

#c #деление #число pi

Вопрос:

Это то, что я сделал для проверки делимости числа на 2 * M_PI. «w» — это константа, равная 2/3, а t — переменная, которая изменяется на t = dt, где dt равно 0,1. Я пытаюсь использовать оператор mod, %, чтобы увидеть, делится ли что-то. Но это не работает.

bool делимое; действительное w = 2/3; действительное t;

 if((w*t) % 2*M_PI == 0)
    {
        divisible = true;
    }

else
    {
        divisible = false;
    }
  

Это ошибка, которую я получаю: «недопустимые операнды типов ‘real’ и ‘int’ в двоичный ‘operator%’»

Что это значит? Как мне заставить это работать? Итак, мне нужно сделать w и t int? Этого не может быть, потому что w равно 2/3, а t увеличивается с 0 на 0,1. Кто-нибудь, пожалуйста, может мне помочь?

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

1. Просто проверьте cos(w*t) == 0 😉

Ответ №1:

Используйте std::fmod вместо этого, он работает с удвоениями, а не с целым % оператором.

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

1. И обратите внимание на ошибки округления, т.Е. не сравнивайте с использованием == , но посмотрите, находитесь ли вы в пределах допустимого эпсилона от желаемого значения.

2. Я получаю ошибки компиляции, w — это double, t — это double, а M_PI, я думаю, с плавающей запятой? Должен ли работать fmod((w * t) / (2 * M_PI))?

3. @QEntanglement, ты посмотрел сигнатуру для функции? Я специально опустил ссылку (т.Е. чтобы вы немного поразмыслили! 😉 )

4. Я новичок. Что вы подразумеваете под сигнатурой для функции? Я видел, что «modf» разделяет целочисленную часть на части с плавающей точкой. Я не знаю, как я буду это использовать.

5. Не имеет значения, делитесь вы или нет, я намекнул, на какую функцию вам следует обратить внимание — вы, например, искали эту функцию? И если бы вы это сделали, вы бы увидели, что это за подпись (т. Е. Какие параметры она принимает, и что она возвращает и т.д.) Это очень поможет вам, когда вы действительно начнете его использовать. И, как я сказал ниже, modf это не операция по модулю, она просто разбивает переданное значение на целые и дробные величины.

Ответ №2:

‘%’ — это оператор целого числа по модулю, который не работает для аргументов с плавающей точкой / двойных / операндов

В математике существует функция float / double modf.h, который может помочь

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

1. modf это не операция по модулю, она просто разбивает double на целые и дробные части.

2. Шаг вычисления для первого аргумента, используемого в вызове функции modf: double arg1 = (w*t) / 2*M_PI. Если результат (дробная часть) равен или почти равен 0.0, то переменной divisible (в примере вопроса) должно быть присвоено значение true. Не забывайте — на результаты повлияла ограниченная точность с плавающей запятой и, возможно, утверждение, что M_PI равно неравенству 0!

Ответ №3:

Зачем вам хотеть знать, точно делится ли число с плавающей запятой на другое?

Арифметика с плавающей запятой не должна использоваться для «точных» вычислений. Результат каждой операции строго определен, но он отличается от математического значения той же операции. В частности:

 double a = 1e20;
double b = 1e-20;

double c = (a   b) - a;
  

Вы могли бы ожидать, что это c будет равно b , но на самом деле это не так!

Вы должны сравнивать числа с плавающей запятой только с некоторым окном. Означает — находится ли конкретное значение с плавающей запятой в некотором диапазоне конечной длины.