Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: koleto в Dec 01, 2010, 15:06



Титла: Намиране на синус с Java
Публикувано от: koleto в Dec 01, 2010, 15:06
Здравейте. Искам да намеря синус на даден ъгъл на Java, без да ползвам Math.sin. За целта реших да използвам Ред на Тейлър.

(http://upload.wikimedia.org/math/7/6/c/76c755ef67f36ae953ba432a51820b21.png)

Ето какво написах от тази сума:
Код
GeSHi (Java):
  1. /*
  2. * Calculating sin x
  3. *
  4. * @param x - size of the angle in degrees
  5. * @param p - accuracy of calculation
  6. * @return sin of x
  7. */
  8. public static double sin(double x, int p){
  9. double s = 0;
  10. for(int i=0; i<=p; i++){
  11. s += Math.pow(-1, i)*(Math.pow(x, 2*i+1)/fac(2*i+1));
  12. }
  13. return s ;
  14. }
  15.  
  16. /*
  17. * Calculating factorial
  18. *
  19. * @param x - number to factorial
  20. * @return x factorial
  21. */
  22. public static double fac(double x){
  23. if(x<=1)    
  24.            return 1;
  25.        else
  26.            return x * fac(x-1);
  27. }
  28.  

Проблема е че получавам грешен резултат. Нещо от рода на:

Math.sin(x)=0.5000000000000004
sin(x)=6.19795175229794E19

Ще се радвам ако някой ми помогне да си открия грешката. Мерси предварително.


Титла: Re: Намиране на синус с Java
Публикувано от: shoshon в Dec 01, 2010, 16:07
Аз не съм кой знае колко добър с математиката, но в ред на Тейлор нямаше ли остатък?

Интересното е, че формулата ти е изключително неоптимизирана и отнема безкрайно много време да се изчисли. Което ме навежда на мислата - ти колко слагаш на p? със сисгурност трябва да е по-голямо от 200-300  за да получиш нещо точно.

От друга страна гледам, че разликата идва още в първите цифри, което говори за грешка от началото на итерацията.

Ама много ме мързи да го пиша...мда...


Титла: Re: Намиране на синус с Java
Публикувано от: clovenhoof в Dec 01, 2010, 16:44
Нямаш грешка в коденето. Сега го пробах на С++ правилно си смята.

double r = sin(0.52359, 10); // = 0.49999 което е правилно


Титла: Re: Намиране на синус с Java
Публикувано от: clovenhoof в Dec 01, 2010, 16:58
бе ти да не въвеждаш градуси?


Титла: Re: Намиране на синус с Java
Публикувано от: b2l в Dec 01, 2010, 17:09
Код
GeSHi (Java):
  1. ...
  2. s += (Math.pow(-1, i)/fac(2*i+1))*Math.pow(x, 2*i+1);
  3. ...


Титла: Re: Намиране на синус с Java
Публикувано от: shoshon в Dec 01, 2010, 17:14
Код
GeSHi (Java):
  1. ...
  2. s += (Math.pow(-1, i)/fac(2*i+1))*Math.pow(x, 2*i+1);
  3. ...

Да те хванат, че да те цапнат...


Титла: Re: Намиране на синус с Java
Публикувано от: b2l в Dec 01, 2010, 17:17
Да те хванат, че да те цапнат...

Пии ти до 4 па да те видим  тогава...


Титла: Re: Намиране на синус с Java
Публикувано от: bop_bop_mara в Dec 01, 2010, 19:27
Айде малко офтопик - кой ще го напише на Scheme/Lisp?  :P :P :P


Титла: Re: Намиране на синус с Java
Публикувано от: b2l в Dec 01, 2010, 19:36
Айде малко офтопик - кой ще го напише на Scheme/Lisp?  :P :P :P

Айде още малко офтопик: Защо да се пише на Scheme като няма смисъл от това?


Титла: Re: Намиране на синус с Java
Публикувано от: lkr в Dec 01, 2010, 20:57
Айде малко офтопик - кой ще го напише на Scheme/Lisp?  :P :P :P
Код
GeSHi (Scheme):
  1.  


Титла: Re: Намиране на синус с Java
Публикувано от: b2l в Dec 01, 2010, 21:02
Радвам се, че се намират ентусиасти и че има хора без работа...


Титла: Re: Намиране на синус с Java
Публикувано от: chen_dzen в Dec 01, 2010, 21:21
а за имането на хора без работа не би трябвало  ::)


Титла: Re: Намиране на синус с Java
Публикувано от: cdiem в Dec 01, 2010, 23:00
@koleto - ако сложиш повече скоби, мисля, че ще проработи
@mara, @backtolife - трия кода; няма смисъл от него (ще си го запазя за мен си, щото ми е първата работеща програма на този език ;b)


Титла: Re: Намиране на синус с Java
Публикувано от: b2l в Dec 01, 2010, 23:03
Много ме кефите като почнете да си ги мерите - особено на Scheme. Някой на някой друг такъв безсмислен език няма ли да се включи? Нещо на руски или на китайски ала-бала.


Титла: Re: Намиране на синус с Java
Публикувано от: bop_bop_mara в Dec 01, 2010, 23:17
Много ме кефите като почнете да си ги мерите - особено на Scheme. Някой на някой друг такъв безсмислен език няма ли да се включи? Нещо на руски или на китайски ала-бала.
Айде дай да ти видим Ц-острото като искаш нещо безсмислено :)

lkr, cdiem  [_]3 [_]3


Титла: Re: Намиране на синус с Java
Публикувано от: b2l в Dec 01, 2010, 23:22
Много ме кефите като почнете да си ги мерите - особено на Scheme. Някой на някой друг такъв безсмислен език няма ли да се включи? Нещо на руски или на китайски ала-бала.
Айде дай да ти видим Ц-острото като искаш нещо безсмислено :)

lkr, cdiem  [_]3 [_]3

Вие с task-а си падате по Ц-острото... Или май забравяш тази малка подробност :D.


Титла: Re: Намиране на синус с Java
Публикувано от: gat3way в Dec 01, 2010, 23:26
Искам на haskell !!!


Титла: Re: Намиране на синус с Java
Публикувано от: b2l в Dec 01, 2010, 23:27
Искам на haskell !!!

Тоз пък и той от къде...


Титла: Re: Намиране на синус с Java
Публикувано от: lkr в Dec 02, 2010, 23:20
Искам на haskell !!!
Код
GeSHi (C):
  1. fac :: Int -> Int
  2. fac 0 = 1
  3. fac n = n * fac (n - 1)
  4.  
  5. sin' :: Float -> Int -> Float
  6. sin' x p =
  7.    sum [ ((-1 ^^ i) * x ^^ (2 * i + 1)) / (fromIntegral $ fac (2*i+1)) | i <- [0..p] ]
  8.  
  9.  


Титла: Re: Намиране на синус с Java
Публикувано от: gat3way в Dec 02, 2010, 23:44
lkr, ти си нечовек :)