Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Амплитуда, диапозон чисел


Автор: SABROG 6.3.2007, 14:04
Хочу получать в цикле значения например от 0 до 100 и чтобы функция синуса возвращала в таком порядке:
0
1
2
...
98
99
100
99
98
...
0
1
2
...
100

Или диапозон -10 ... +10
-10
-9
-8
...
0
1
2
...
10
9
8
...
1
0
-1
...
-10

А также хочу иметь возможность указать границы типа 65-95


Например чтобы получить диапозон 0-255 подобрал эмпирически значения 127,128. Но часто получаю например десять нулейт, потом десять единиц, три двойки и т.п. Видимо результат округления. Хочу четкий шаг в 1.

Код

int a=0;
for (int i=0; i < 1000; i++)
{
a = (Sin(3.141592653589*i/100)*127)+128;
}



Автор: aldari 6.3.2007, 15:47
Хочешь четкий шаг в единицу -- никогда не используй числа с плавающей точкой.


Автор: Earnest 6.3.2007, 21:03
Четкий шаг в единицу? 
Это чтобы каждый следующий результат (a) отличался от предыдущего ровно на единицу?
С помощью синуса?
Наверное, я чего-то не понимаю...  Зачем тебе синус-то?

Автор: SABROG 6.3.2007, 22:09
Цитата(Earnest @ 6.3.2007,  21:03)
Четкий шаг в единицу? 
Это чтобы каждый следующий результат (a) отличался от предыдущего ровно на единицу?
С помощью синуса?
Наверное, я чего-то не понимаю...  Зачем тебе синус-то?

Сам не знаю. Думал это хороший способ генерирования циклических последовательностей кроме этого:

Код

int a=10, b=20;
while(1)
{
for (int i=a; i < b; i++)
{
по нарастающей...
}
for (int i=b; i >= a; i--)
{
по убывающей
}
}

Автор: Earnest 7.3.2007, 09:26
А чем тебя простые циклы не устраивают? Нужно в виде функции написать что ли?

Автор: SABROG 7.3.2007, 10:19
Я написал для проверки этот код:

Код

int Start1=GetTickCount(),End1,Start2,End2;
int k=0;
for (int i=0; i < 1000000; i++)
{
k = (Sin(3.141592653589*i/100)*127)+128;
}
End1 = GetTickCount();
Label1->Caption = IntToStr(End1-Start1);
Start2=GetTickCount();
int a=0, b=255;
for(int j=0; j < 1000000; j++)
{
for (int i=a; i < b; i++)
{
k = i;
}
for (int i=b; i >= a; i--)
{
k = i;
}
}
End2 = GetTickCount();
Label2->Caption = IntToStr(End2-Start2);


Как результат получаю в двух Labelaх значения: 94 и 1234
Т.е. первый код работает в 13 раз быстрее.

Автор: Earnest 9.3.2007, 10:49
Самому-то ничего странным не показалось? Синус, видишь ли, у него работает быстрее чем ничего. 
У тебя второй код содержит вложенные циклы, соответственно общее число итераций умножается на 256*2. Ты бы хоть подумал сколько периодов каждый код тебе генерирует.

Автор: SABROG 9.3.2007, 13:43
С математикой у меня всегда были проблемы, потому и спрашиваю про синусы smile
Ну раз не судьба, значит не судьба. Будем использовать старые добрые циклы, спасибо за участие.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)