#c #arduino
#c #arduino
Вопрос:
Я пытаюсь использовать (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. Если я использую 1.5 вместо 1.5 * i / 360 в операторе if, результатом будет 1.00, 30, 150,0,0,0,0,0,0,0 (что правильно). Но если я использую 1.5 * i / 360, результат будет 1.00,0,0,0,0,0,0,0,0,0,0.
Ответ №1:
Значения с плавающей точкой хранятся в памяти, в отличие от того, что мы делаем это на бумаге. Значения с плавающей запятой хранятся в виде степеней 2. Таким образом, 0,5 или 0,25 могут быть сохранены точно, а 0,2 или 0,3 — нет.
Вы пытаетесь сравнить два поплавка (sin(d*(PI/180)) 1
и 1.5*i/360
. d
в вашем случае (хотя это float) фактически представлено как целое число и хранится точно и i
является float. Таким образом, левая и правая стороны могут быть приблизительно равны, но действительно равны (очень) редко. Вы можете использовать конструкцию, подобную этой:
посчитайте fabs(arg1-arg2)
и сравните этот результат с требуемым epsylon
(некоторым незначительным значением, которое представляет незначительную разницу между аргументами).