/* ========================================================================== */ /* */ /* proj2.c */ /* (c) 2001 xmunkf00 Filip Munk */ /* xmunkf00@stud.fit.vutbr.cz */ /* */ /*============================================================================*/ /* */ /* Vypocet tg a ln pomoci iteracnich vzorcu */ /* prepocty dat vystupujicich z radaru. prevod rychlosti na drahu a naopak */ /* */ /* ========================================================================== */ ////////////////////////////////// //Pripojeni hlavickovych souboru// ////////////////////////////////// #include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <string.h> #include <math.h> //////////////////////////////// //Konstanty a jine datove cosi// //////////////////////////////// const double CAS=0.5; ///////////////////////// //Matematicke konstanty// ///////////////////////// const double PI=3.1415926535897932384626433; const double E =2.7182818284590452353602874; //////////////////////////////// //Text napovedy // //////////////////////////////// const char *HELP= "\nProgram tg_ln_rad (projekt 2).\n" "Autor: Filip Munk (c) 2008\n\n" "Format vstupu: -tg [EPS] [JEDNOTKA]\n" " -ln [EPS]\n" " -radar1\n" " -radar2\n" "PARAMETRY\n\n" "\t-h\t \tVypise tuto obrazovku.\n" "\t-tg\t [EPS] Pocita tg s presnosti zadanou v dalsim argumentu.\n" "\t-ln\t [EPS] Pocita ln s presnosti zadanou v dalsim argumentu.\n\n" " EPS\n\n" "epsilon je mozno zadat jako cislo 1e-x a nebo jako desetinne cuslo.\n\n" " JEDNOTKA\n\n" "\t deg\t" "Pokud jednotka neni zadana funkce tangens pocita na vstupu s radiany." "Pokud je zadano deg funkce pocita s uhlem ve stupnich."; //////////////////////////////////// //cast Matematicka a goniometricka// //////////////////////////////////// //////////////////////////////////////////////// //prevadi data v argumentu z radianu na stupne// //////////////////////////////////////////////// double proj2_rad2deg(double data) { data*=180; return data; } ///////////////////////////////////////////////// //prevadi data v argumentu ze stupnu na radiany// ///////////////////////////////////////////////// double proj2_deg2rad(double data) { data/=180; return data; } /////////////////////////////////////// //absolutni hodnota ze zadaneho cisla// /////////////////////////////////////// double proj2_sin2konv(double data) { if (data>0.5) return proj2_sin2konv(data-0.5); if (data<-0.5) return proj2_sin2konv(data+0.5); else return data; } double proj2_abs(double data) { if (data<0) data*=-1; return data; } //////////////////////////////////// //pocita mocninu ze zadaneho cisla// /////////////////////////////////////////////////////// //prvni argument - zaklad sinu // //druhy argument - epsilo (presnost) // //funkce vraci desetinne cislo // /////////////////////////////////////////////////////// double proj2_exp(double base, double exp) { while (exp>1) { base*=base; exp--; } return base; } //////////////////////// //Prirozeny logaritmus// //////////////////////////////////////// //prvni argument - zaklad logaritmu // //druhy parametr - epsilon (prestnost)// //////////////////////////////////////// double proj2_ln(double data, double eps) { /* double exp=0; //Urceni krytickych hodnot pri logaritmu if (data== 0) { return -INFINITY; } if (data < 0) { return NAN; } //Prevod do oboru konvergence; while (data>=1) { data/=E; exp++; } double data2=data; double item=0; double up=data; double down=1; double iter=3; double down2=data2; double data3=data*data; double data4=data2*data2; double temp=data/data2; data-=1; data2+=1; while (proj2_abs(temp)>=eps ) { up *=data3; down2*=data4; down=iter*down2; temp=(up/down); item+=temp; iter+=2; printf("%.50lf\n", temp); } item+=data/data2; item*=2; if (exp!=0) { item+=exp; } return item;*/ if (data== 0) { return -INFINITY; } if (data < 0) { return NAN; } double exp=0; while (data>=2) { data/=E; exp++; //printf("%.308lf\n",data); } //double temp=data; double data2=data; data-=1; data2+=1; double item=0; double up=data; double down=1; double iter=3; double down2=data2; double data3=data*data; double data4=(data2*data2); double temp=data/data2; while (proj2_abs(temp)>=eps ) { up *=data3; down2*=data4; down=iter*down2; temp=(up/down); item+=temp; iter+=2; //printf("%.50lf\n", temp); } item+=data/data2; item*=2; if (exp!=0) { item+=exp; } return item; } //////////// //sinus X // ////////////////////////////////////// //prvni argument - zaklad sinu // //druhy argument - epsilo (presnost)// //funkce vraci desetinne cislo // ////////////////////////////////////// double proj2_kpi(double data) { int res; res= 0; if (data < 0) { res++; } return res; } double proj2_sin(double data, double eps) { int kolik=1; if (data>=1) { while (data>=1) { data-=1; kolik*=-1; } } if (data<=-1) { while (data<=-1) { data+=1; } kolik&=-1; } data*=PI; int tmp=proj2_kpi(data); data = proj2_abs(data); double data2 = proj2_exp (data, 2); int iter = 3; double iter1=iter; double temp = data; double add = data; while (proj2_abs (add) >= eps) { iter1=iter - 1; add = (-add/(iter * iter1)); add*=data2; iter += 2; temp += add; } if (tmp != 0) { temp *= -1; } temp*=kolik; return temp; } /////////////////////////////////////////////////////// //funkce pro vypocet cos .vyuziva vztahu k funkci sin// /////////////////////////////////////////////////////// //prvni argument - zaklad sinu // //druhy argument - epsilo (presnost) // //funkce vraci desetinne cislo // /////////////////////////////////////////////////////// double proj2_cos(double data, double eps) { data=data+(0.5); data=proj2_sin(data,eps); return data; } /////////////////////////////////////////////////////// //funkce pro vypocet tg // /////////////////////////////////////////////////////// //prvni argument - zaklad sinu // //druhy argument - epsilo (presnost) // //funkce vraci desetinne cislo // /////////////////////////////////////////////////////// double proj2_tg(double data, double eps) { double sinus,cosin; int cosint; cosin=proj2_cos(data, eps); cosint=cosin; sinus=proj2_sin(data,eps); data=sinus/cosin; return data; } ////////////////////////////////////// //pocita faktorial ze zadaneho cisla// ////////////////////////////////////// double proj2_fact(double data) { if (data == 0) return 1; else return data*proj2_fact(data-1); // data=data-1; } //////////////////////////////////// //cast s Fyzikou (draha, rychlost)// //////////////////////////////////// double proj2_radar1(double data , double v0,float cas) { data=((data/2)*proj2_exp(cas,2)+v0*cas); return data; } double proj2_radar2(double data, double s0,float cas) { data-=s0*cas; data/=proj2_exp(cas,2); data*=2; return data; } //////////////////////////////////////////////////// //Zbytek podpurne funkce. nacitani dat a argumentu// //////////////////////////////////////////////////// int main(int argc, char *argv[]) { double data,eps,vstup,v0; int res; double v0x,v0y,v0z; // double x,y,z; int menidlo=0; float cas=0; v0x=0; v0y=0; v0z=0; if (argc==2 && (strcmp(argv[1],"-radar1")==0 || strcmp(argv[1],"-radar2")==0)) { while ((res=scanf("%lf",&data))==1) { cas+=CAS; if (menidlo==0) { v0=v0x; } else if (menidlo==1) { v0=v0y; } else if (menidlo==2) { v0=v0z; } if (strcmp(argv[1],"-radar1")==0) { data=proj2_radar1(data, v0,cas); } else { data=proj2_radar2(data, v0,cas); } if (menidlo==0) { v0x=data; } else if (menidlo==1) { v0y=data; } else if (menidlo==2) { v0z=data; } printf("%lf ", data); menidlo++; if (menidlo==3) menidlo=0; }} else if ((argc==4 || argc==3) && (strcmp(argv[1],"-tg")==0 || strcmp(argv[1],"-ln")==0)) { if (strcmp(argv[1],"-tg")==0) { eps=atof(argv[2]); while ((res=scanf("%lf",&data))==1) { if ( argc==4 && strcmp(argv[3],"deg")==0) { data=proj2_deg2rad(data); } data=proj2_tg(data,eps); printf("%lf\n", data); } } else { eps=atof(argv[2]); while ((res=scanf("%lf",&data))==1) { data=proj2_ln(data,eps); printf("%lf\n", data); } } } else { printf(HELP); } return EXIT_SUCCESS; } ///////////////////////////////////////////////////////////////// //#############################################################// //##################!! konec proj2.c !!#######################// //#############################################################// /////////////////////////////////////////////////////////////////
|
|||
