2016-10-03 1 views
5

Проблема: У меня есть IF заявление if (x == 180 || x == 360 || x == 540 и так далееКак сравнить число с другими номерами, не записывая их все на C?

Как я могу держать этот список собирается без написания 180 + 180 * n все вне дома?

Дополнительная информация: Я хочу напечатать «не существует», если sin (x * M_PI/180) равен 0. Это значение равно 0, когда sin (180), sin (360) и т. Д.

EDIT: Я пытался sin(x2 * M_PI/180) == 0, но он не работает (возможно, потому, что его близко к 0, но не 0)

+0

Спасибо всем, я понял! – Karl

+0

Если 'x' целое число или число с плавающей запятой? Что, если значение -180, -360, ...? – chux

+0

Пожалуйста, ответьте или удалите вопрос. – xpereta

ответ

9

использования по модулю операнд:%

if (x>0 && x%180==0) {..} 
+0

Да, я разобрал его и получил. Большое спасибо! – Karl

3
if (180 <= x && x % 180 == 0) 

должны это сделать. Почему вы используете M_PI?

+0

Если он хочет сделать это сложным способом с грехом, это то, что нужно сделать для преобразования в радианы. – kalj

2

Если x представляет собой целое число, вы можете использовать оператор остатка в выписке IF:

if((x%180) == 0) 
{ 
    // ... 
} 

Или, если x не является целым числом, то вы можете использовать fmod:

if(fabs(fmod(x, 180.0)) < DBL_EPSILON) 
{ 
    // ... 
} 
6

Посмотрите на мод % Оператор. Это дает вам остальную часть при выполнении дивизий. Так

(x % 180) 

будет 0 для любого целого числа, кратного 180 (при условии, что вы не настолько высоки, что вы получите какие-то странные обертку вокруг, скажем, более 4 млрд число без знака.)

Таким образом, вы мог использовать.

if ((x % 180) == 0) 
1

небрежный но практический тест

if (fabs(sin(a)) < FLT_EPSILON) 
    treataszero(); 
+2

При сравнении с нулевым значением [метод epsilon может быть не таким, каким вы хотите) (https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/). – user694733

+0

Нет, это неряшливо.Но обычно деление на очень маленькое значение почти так же плохо, как деление на ноль, потому что единица с плавающей запятой не справляется и точность теряется. Обычно использование FLT_EPSILON как «эффективно нулевого» достаточно хорошо, но не для серьезной численной работы. –

1

То, что кажется выше проблема уровня OP в «попытался грех (x2 * M_PI/180) == 0, но он не работает (возможно, потому, что его близкий до 0, но не 0). «Цель состоит в том, чтобы взять синус x, выраженный в градусах.

Вместо того, чтобы x%180, что является проблемой, если x является плавающей точкой, идея заключается в том, чтобы уменьшить sin/cos аргумент в диапазоне от 90 градусов первых перед преобразованием в радианах. Не нужно отказываться от некоторой точности при сравнении EPSILON.

См. c++ Sin and Cos, чтобы получить точное значение для многих случаев n*90 degrees и другие улучшения точности.