#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, который может помочь
- пример можно найти, например, по адресуhttp://www.cplusplus.com/reference/clibrary/cmath/modf /
Комментарии:
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
, но на самом деле это не так!
Вы должны сравнивать числа с плавающей запятой только с некоторым окном. Означает — находится ли конкретное значение с плавающей запятой в некотором диапазоне конечной длины.