PDA

Tam Sürümünü Görmek İçin : seri kullanarak sinus hesaplama


cappytoi
07/05/2006, 00:02
kısaca,


#include <stdio.h>
double pow(double , double);

double faktoriyel(int sayi) {
double sonuc=1;
while(sonuc *= sayi--,sayi > 1);
return sonuc;
}

double sinus_seri(double aci,int sira,int mutlak) {
if (mutlak == 0)
return (pow(-1,sira) * pow(aci,2 * sira + 1) / faktoriyel(2 * sira + 1));
else
return (pow(aci,2 * sira + 1) / faktoriyel(2 * sira + 1));
}

double sinus_hata(double aci,double hata_payi) {
int isaret=1,terim=0,aci_i;
double sonuc=0;
while (aci < 0) aci += 360;
while (aci > 360) aci -= 360;
aci_i = (int) aci;
if (aci > 180) aci -= 180;
if (aci > 90) aci = 180 - aci;

if ((aci_i % 360) > 180) isaret = -1;

aci = aci * 3.14 / 180;

while (hata_payi <= sinus_seri(aci,terim,1)) terim++;
while (terim >= 0) {
sonuc += sinus_seri(aci,terim,0);
terim--;
}
return isaret * sonuc;
}

int main(void) {
double hata,aci;
printf("Lutfen aciyi derece cinsinden giriniz: ");
scanf("%lf",&aci);
printf("Lutfen hata oranini giriniz: ");
scanf("%lf",&hata);
printf("%lf",sinus_hata(aci,hata));
return 0;
}


hatam varsa bildirin :)


UnBiaSeD
07/05/2006, 12:39
dev C++ compile ederken hata werdi :P

myavuzselim
07/05/2006, 14:48
T_i = (-1)^i * x^(2*i + 1) / (2*i + 1)!

Buna gore her seriyi en bastan hesaplamana gerek yok. Soyle birsey yapabilirsin:

#define PI 3.1415926535897931
#define PI2 1.5707963267948966

#define myabs(x) ((x) < 0 ? -(x) : (x))

double sin_in_pi2(double x, double epsilon) {
double us = x;
double fact = 1;
int i = 2;
int isaret = 1;
double seri = isaret * us / fact;
double toplam = seri;
while (myabs(seri) > epsilon) {
isaret = -isaret;
fact *= i * (i+1);
us *= x*x;
i += 2;
seri = isaret * us / fact;
toplam += seri;
}
return toplam;
}

double mysin(double x, double epsilon) {
int isaret = 1;
if (x < 0) {
x = -x;
isaret = -isaret;
}
x -= ((int)(x/(2*PI))) * 2*PI;
if (x >= PI) {
x -= PI;
isaret = -isaret;
}
if (x >= PI2)
x = PI - x;

return isaret * sin_in_pi2(x, epsilon);
}

cappytoi
07/05/2006, 16:04
dev C++ compile ederken hata werdi :P
haklısın düzenledim...

cappytoi
07/05/2006, 16:12
@myavuzselim; verdiğin kod ile 45 derecenin sinüsü epsilon 0.001 iken 0.850900 çıkıyor. oysaki sin45 =~ 0.7071067812 değerindedir. ya fonksiyonu ben yanlış kullandım ya da kod hatalı.

myavuzselim
07/05/2006, 17:13
Aciyi radyan olarak girmen lazim.

acehreli
07/05/2006, 18:49
myavuzselim, senin tanimladigin PI ve PI2 makrolari aslinda standart tarafindan da <math.h> basliginda M_PI ve M_PI_2 adlariya tanimlanmislardir.

Su sayfa dogruysa tabii:

http://www.opengroup.org/onlinepubs/009695399/basedefs/math.h.html

Ali

myavuzselim
07/05/2006, 19:45
math.h 'da var mi diye google'da aramistim. Burada standard olmadigi yaziyor: http://www.linuxtopia.org/online_books/an_introduction_to_gcc/gccintro_27.html

acehreli
08/05/2006, 02:33
Haklisin... Tam da standart olmayan bir ek olanak ornegi olarak kullanmislar :)

Ali