SourceForge.jp

dkutilMath.h

説明を見る。
00001 
00002 
00003 
00004 #ifndef __dkutil_Math__ // include once
00005 #define __dkutil_Math__
00006 
00007 #include <dkutil/dKingyoMacro.h>
00008 
00009 #define MINMAX_SWAP(type,min,max) if(min>max){type temp=min;min=max;max=temp;/*min^=max^=min^=max;*/}
00010 #define MINMAX_ABS(min,max) if(min<0){min=abs(min);}if(max<0){max=abs(max);}
00011 #define MINMAX_SAFETY(min,max) if(min == max){max++;}
00012 
00013 #define MINMAX_SWAP_FLOAT(type,min,max) if(min>max){type t=min;min=max;max=t;}
00014 #define MINMAX_ABS_FLOAT(type,min,max) if(min<0){min=(type)fabs(min);}if(max<0){max=(type)fabs(max);}
00015 
00016 #ifndef PI
00017 #define PI 3.14159265f
00018 #define DKUTIL_PI_SETED
00019 #endif
00020 
00021 namespace dkutil{//begin dkutil namespace
00022     namespace oldmath{//begin math namespace
00032 extern int CreateArthimeticProgression(int *array,DWORD num,int a,int d);
00033 
00045 extern int CreateGeometricProgression(int *array,DWORD num,int a,int r);
00046     
00059 extern int CreateRandomNumberProgression(
00060         int *array,
00061         DWORD num,
00062         int min,int max,
00063         int (*rand_func_callback)(int min_,int max_));
00064 
00067 extern short GetAngle(int mx,int my,int sx,int sy);
00068 
00069 #ifdef _MSC_VER
00070 extern ULONGLONG __fastcall GetRDTSC();
00071 #else
00072 extern ULONGLONG GetRDTSC();
00073 #endif
00074 
00075 //#ifndef USE_DKINGYO_FOX_1_1
00076 #if _MSC_VER >= 1000
00077 #   pragma warning(disable:4244)
00078 #   pragma warning(disable:4305)
00079 #endif
00080 
00103 DINLINE float sin(float f)
00104 {
00105 
00106     
00107     // まず、fを-π〜πの範囲に修正する
00108     int i;
00109     if (f > PI)
00110         {
00111         i  = f / (2.0f * PI);
00112         f -= i * 2.0f * PI;
00113         if (f > PI) f -= 2.0f * PI;
00114 
00115     }else if (f < -PI)
00116         {
00117         i  = f / (2.0f * PI);
00118         f -= i * 2.0f * PI;
00119         if (f < -PI) f += 2.0f * PI;
00120     }
00121     
00122     float ftemp, f2 = f * f;
00123     float ret;
00124     
00125     ret    = f;
00126     ftemp  = f2 * f; // f^3
00127     ret   -= (1.0f /      6.0f) * ftemp;
00128     ftemp *= f2;     // f^5
00129     ret   += (1.0f /    120.0f) * ftemp;
00130     ftemp *= f2;     // f^7
00131     ret   -= (1.0f /   5040.0f) * ftemp;
00132     ftemp *= f2;     // f^9
00133     ret   += (1.0f / 362880.0f) * ftemp;
00134     
00135     return ret;
00136 }
00137 
00153 DINLINE float cos(float f)
00154 {
00155     /*
00156       テイラー展開した、cos級数
00157       cos(x) ≒ 1 - (1 /   2) * x^2 + (1 /    24) * x^4
00158                   - (1 / 720) * x^6 + (1 / 40320) * x^8
00159       
00160       この近似式の有効な範囲は、-π <= r <= πであるため、
00161       値の調整を行う
00162     */
00163     
00164     // まず、fを-π〜πの範囲に修正する
00165     if (f < 0.0f) f *= -1.0f;
00166     int i = f / (2.0f * PI);
00167     f -= i * 2.0f * PI;
00168     if (f > PI) f -= 2.0f * PI;
00169     
00170     float ftemp, f2 = f * f;
00171     float ret;
00172     
00173     ret    = 1.0f;
00174     ftemp  = f2; // f^2
00175     ret   -= (1.0f /     2.0f) * ftemp;
00176     ftemp *= f2; // f^4
00177     ret   += (1.0f /    24.0f) * ftemp;
00178     ftemp *= f2; // f^6
00179     ret   -= (1.0f /   720.0f) * ftemp;
00180     ftemp *= f2; // f^8
00181     ret   += (1.0f / 40320.0f) * ftemp;
00182 
00183     return ret;
00184 }
00185 
00205 DINLINE float asin(float f)
00206 {
00207     /*
00208      
00209     */
00210     //assert(!"called KM_Basic::asin!!");
00211     
00212     float ftemp, f2 = f * f;
00213     float ret;
00214     
00215     ret    = f;
00216     ftemp  = f2 * f; // f^3
00217     ret   += ( 1.0f /    6.0f) * ftemp;
00218     ftemp *= f2;     // f^5
00219     ret   -= ( 3.0f /   40.0f) * ftemp;
00220     ftemp *= f2;     // f^7
00221     ret   += ( 5.0f /  112.0f) * ftemp;
00222     ftemp *= f2;     // f^9
00223     ret   += (35.0f / 1152.0f) * ftemp;
00224 
00225     return ret;
00226 }
00227 
00248 DINLINE float acos(float f)
00249 {
00250     /*
00251       
00252     */
00253     //assert(!"called KM_Basic::acos!!");
00254     
00255     float ftemp, f2 = f * f;
00256     float ret;
00257     
00258     ret    = ( 1.0f /    2.0f) * PI - f;
00259     ftemp  = f2 * f; // f^3
00260     ret   -= ( 1.0f /    6.0f) * ftemp;
00261     ftemp *= f2;     // f^5
00262     ret   -= ( 3.0f /   40.0f) * ftemp;
00263     ftemp *= f2;     // f^7
00264     ret   -= ( 5.0f /  112.0f) * ftemp;
00265     ftemp *= f2;     // f^9
00266     ret   -= (35.0f / 1152.0f) * ftemp;
00267     
00268     return ret;
00269 }
00270 
00304 //#ifndef _DKUTIL_MSVC6LINKER_POLICY_H_
00305 DINLINE float sqrtf(float f){
00306 
00307     float s, last;
00308     
00309     if (f > 1e-10){
00310         if (f > 1.0f) s = f;
00311         else s = 1.0f;
00312         
00313         do{
00314             last = s;
00315             s    = (f / s + s) * 0.5;
00316         }while (s < last);
00317         
00318         return last;
00319     }
00320     
00321     if (f < 0.0f) return -1.0f;
00322     
00323     return 0.0f;
00324 }
00325 //#endif
00326 #if _MSC_VER >= 1000
00327 #   pragma warning(default:4244)
00328 #   pragma warning(default:4305)
00329 #endif
00330 
00331 
00332 
00333 
00334 
00335 
00336 
00357 
00358 extern double kai2(double o1,double o2,double e1,double e2);
00359 extern float kai2(float o1,float o2,float e1,float e2);
00360 
00361 
00362 }//end of math namespace
00363 }//end of dkutil namespace
00364 
00365 
00366 #ifdef DKUTIL_PI_SETED
00367 #undef PI
00368 #endif
00369 
00370 #endif//end of include once

dkutil 1.02リリース前 d金魚専用マニュアルバージョンに対してSun Dec 28 21:23:08 2003に生成されました。 doxygen 1.3.5