-
Всем привет. Требуется вычислить синус и косинус. Формула известна: Sin A = X/Radius, Cos A = Y/Radius. Отсюда вопрос: как получить величину X и Y, если известен только угол? Тут картинка: https://yadi.sk/i/UdcTmWDS3UDDGB
-
-
Мне надо понять откуда берутся формулы вроде Sqrt(2.0) / 2.0 = 0,7071067.... Как вычислить откуда взялась двойка и почему надо делить корень из двух на двойку при 45°, например.
-
>Если радиус неизвестен, то никак. Радиус известен. Он равен единице. На крайний случай можно взять любое простое число. Например 7.
-
Из того что углы по 45 следует что X=Y Из теоеремы пирфогора R=sqrt(x^+y^2) Тогда sin A=X/R=X/sqrt(x^+y^2) X/sqrt(2X^2)=x/{sqrt(2)x}=1/sqrt(2) домножаем на sqrt(2) числитель и знаменатель sqrt(2)/2
-
Нагрузить сопроцессор? Использовать любое разложение в ряд? Завести таблицу готовых ответов?
-
-
Спс всем. Сделал через ряды Тейлора.
-
Просто интересно, а чем не угодили функции sin, cos и SinCos?
-
>Просто интересно, а чем не угодили функции sin, cos и SinCos? Да всем угодили. Просто тему «поковырял». Стало интересно как сделать это без процессора. Оказывается можно.
-
> dmk © (11.04.18 09:06) [9] > Стало интересно как сделать это без процессора. Оказывается можно.
Одно мне не понять: почему бы так сразу вопрос и не поставить? ;)
("без процессора" - это, конечно, не совсем удачная фраза, в вопросе если бы она была - то всё ушло бы не туда, аккуратнее тут бы надо.)
-
Кстати, вот такая штука еще есть, например:
... var a:array[0..200] of extended;
implementation
procedure FillArr; var k:extended; i:integer; begin a[0]:=0; a[1]:=0.01; k:=1.9996; for i:=2 to 200 do a[i]:=k*a[i-1]-a[i-2]; end; ...
Угадайте, что за массив мы получим?
-
тангенс?
-
Вот например так можно:
//На входе угол в градусах, результат в радианах function Sin_Taylor(X: Double): Double; const OneD: Double = 100000000000000.0; //14 разрядов точности OneM: Double = 0.00000000000001;
var N: Integer; sqrX, Cur, Ret: Double; K, K2: Integer; radX: Double;
begin Ret := 0.0; radX := NormalizeAngle(X) * DegToRadD;
N := 10 + 2 * Abs(Trunc(radX)); radX := TruncD(OneD * radX); Cur := radX; SQRX := (radX * radX);
for K := 0 to N do begin Ret := (Ret + Cur); K2 := (K shl 1); Cur := FloorDiv(-Cur * SQRX, (K2 + 2) * (K2 + 3) * OneD * OneD); end;
Result := (Ret * OneM); end;
//На входе угол в градусах, результат в радианах function Cos_Taylor(X: Double): Double; const Epsilon: Double = 0.00000000000001;
begin Result := Sin_Taylor(NormalizeAngle(X) - 90.0); if Abs(Result) <= Epsilon then Result := 0.0; end;
Функция не моя. Подсказали.
-
Теперь вот полиномами занимаюсь. Вариантов вычисления синуса и косинуса вагон и маленькая тележка. Думаю пока какой полином выбрать. Говорят полиномы Чебышёва самые точные в районе нуля.
-
> KilkennyCat © (11.04.18 23:35) [12] > > тангенс?
В данном случае массив синусов с шагом 0,01 (около 0,57 градуса)
-
> SergP © (12.04.18 00:19) [15]
эх,не угадал. я думал, что раз синусы и косинусы уже были, то вероятность тангенса высока )
-
> SergP © (12.04.18 00:19) [15]
и, кстати, спасибо. Пригодится.
-
> kilkennycat © (12.04.18 00:38) [17] > > > > SergP © (12.04.18 00:19) [15] > > и, кстати, спасибо. Пригодится.
Кстати, тут небольшая ошибочка (из-за нее амплитуда синусоиды уменьшается в 2 раза а частота увеличивается в 2 раза): > k:=1.9996;
при шаге 0,01 оно должно быть равным 1,9999 A[0]:=0; A[1]:=0.01; k=1.9999;
-
> из-за нее амплитуда синусоиды уменьшается в 2 раза а частота > увеличивается в 2 раза
именно это и нужно.
|