Почему я не могу использовать динамическую переменную в моем цикле if? - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь использовать (i) сумму синусоидальных значений в качестве основы для моего цикла if. Цикл if должен хранить значения (d), для которых sin (d * pi / 180) +1 равно дробной или кратной (i), в массив arr. Когда я пытаюсь использовать i в правой части оператора if, код не работает должным образом, но если я пытаюсь использовать константы, то код работает. Мне нужен способ использовать переменные, потому что я не буду знать заранее, кем я буду.

int arr[10];
//signed int d;
float i = 0;
int p;
float d;
float e;
//float s = sin(d*(PI/180))+1;//float produces decimals
void setup(){
  Serial.begin(9600);
}
void loop(){
  for(d = 0; d < 360; d++){
    i = i + sin(d*(PI/180))+1;//add each value to the previous one
  }
  Serial.println(i/360);//print the average of the values
    delay(500);  

  for(d = 0; d < 360; d++){
    if (sin(d*(PI/180))+1 == 1.5*i/360){
        arr[p++] = d;
      }
  }
  for(p = 0; p < 10; p++){
    Serial.println(arr[p]);
    delay(500);
  }

}

1 Ответ

2 голосов
/ 13 марта 2019

Значения с плавающей запятой хранятся в памяти, в отличие от того, что мы делаем на бумаге. Поплавки хранятся в виде степеней 2. Таким образом, 0,5 или 0,25 можно хранить точно, а 0,2 или 0,3 - нельзя.

Вы пытаетесь сравнить два числа с плавающей точкой (sin(d*(PI/180))+1 и 1.5*i/360. d в вашем случае (хотя это и есть float) фактически представляется как целое число и хранится точно, а i - это число с плавающей точкой. Таким образом, левая и правая стороны могут быть приблизительно равными, но действительно равны (очень) редко. Вы можете использовать такую ​​конструкцию:

Количество fabs(arg1-arg2) и сравните этот результат с требуемым epsylon (некоторое незначительное значение, которое представляет собой незначительную разницу между аргументами).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...