	/********************************************************************/
	/*                                                                  */
	/*  math.h                                                          */
	/*       version 0          1992/08/31        K.Shinozuka           */
    	/*       modified	    1997/03/17	      T.Katahira	    */
    	/*		change function declaration to the ANSI style	    */
	/*                                                                  */
	/*  math.h contains followings.                                     */
	/*    extern declarations of math-functions                         */
	/*    extern declarations of special codes and useful numbers       */
	/*                                                                  */
	/*       modify for P/ECE   2015/07/25        Naoyuki Sawa          */
	/*		- /usr/PIECE/include にあるファイルよりも、このファイルが優先されるよう、clip.mkにて、インクルードパスを設定してあります。	*/
	/*		- log2()を追加しました。実装は、cliplibc.cにあります。log2()は、C99で追加された関数です。「Lua 5.3.1」が、使用しています。	*/
	/*		  EPSONライブラリにも、Visual C++ 6.0にも、log2()は含まれていません。								*/
	/*       modify for P/ECE   2015/11/18        Naoyuki Sawa          */
	/*		- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。	*/
	/*       modify for P/ECE   2015/11/24        Naoyuki Sawa          */
	/*		- M_E,M_PI等の定義を、clipfix.h⇒math.hへ移動しました。	*/
	/*       modify for P/ECE   2016/03/24        Naoyuki Sawa          */
	/*		- signbit(),copysign(),copysignf()を追加しました。											*/
	/*		  これらはC99で追加された符号操作用のマクロ,及び,関数で、あまり使う事は無いと思いますが、覚えておくために実装しておく事にしました。	*/
	/*		- round(),roundf(),nearbyint(),nearbyintf(),rint(),rintf(),lround(),lroundf(),lrint(),lrintf()を追加しました。				*/
	/*		  これらはC99で追加された丸め関数で、特に、lround()が便利だと思います。									*/
	/*		  いままでは'(int)((x>=0.0)?(x+0.5):(x-0.5))'のように書いていた処理が、'lround(x)'だけで済むようになりました。				*/
	/*		- 宣言は全て、include/math.hに有ります。												*/
	/*		  倍精度バージョンの関数、copysign(),lround(),lrint(),round(),nearbyint(),rint(),trunc()の実装は、cliplibc.cに有ります。		*/
	/*		  単精度バージョンの関数、copysignf(),lroundf(),lrintf(),roundf(),nearbyintf(),rintf(),truncf()の実装は、framflt2.cに有ります。		*/
	/*		  実装を分けた理由は、単精度演算ライブラリが(アプリケーションが使用していないのに)無駄にリンクされて、サイズが増える事を防ぐためです。	*/
	/*       modify for P/ECE   2016/03/28        Naoyuki Sawa          */
	/*		- fdim(),fdimf(),fmin(),fminf(),fmax(),fmaxf(),fma(),fmaf()を追加しました。								*/
	/*		  これらはC99で追加された関数です。													*/
	/*		  fdim()は、何に使うのか良く判らないのですが、覚えておくために実装しておく事にしました。	⇒{{2016/03/29コメント追記を参照せよ}}	*/
	/*		  fmin(),fmax()は、min(),max()マクロよりも型を明示出来るし副作用が無いので、便利に使用出来ると思います。				*/
	/*		  fma()は、積和演算を短く・判り易く書けるので、(使う場面は少ないと思いますが)使い道は有ると思います。					*/
	/*		- 宣言は全て、include/math.hに有ります。												*/
	/*		  倍精度バージョンの関数、fdim(),fmin(),fmax(),fma()の実装は、cliplibc.cに有ります。							*/
	/*		  単精度バージョンの関数、fdimf(),fminf(),fmaxf(),fmaf()の実装は、framflt2.cに有ります。						*/
	/*		  実装を分けた理由は、単精度演算ライブラリが(アプリケーションが使用していないのに)無駄にリンクされて、サイズが増える事を防ぐためです。	*/
	/*		//{{2016/03/29コメント追記																		*/
	/*		  fdim()の使いみちがありました。																	*/
	/*		  上限を設けずにカウントアップするカウンタiCntでフェードアウトを管理したい場合、以下のようにfdim()を使うと簡単に1.0⇒0.0に変化し0.0で飽和するalphaを得る事が出来ます。	*/
	/*		  │int iCnt = 0;																			*/
	/*		  │for(;;) {																				*/
	/*		  │  if(kbhit()) { iCnt = 1; }																		*/
	/*		  │  double alpha = fdim(1.0, (double)iCnt / (double)SEC(3.0)); //iCnt=0ならばalpha=1.0、iCnt=1⇒SEC(3.0)でalpha=0.9666⇒0.0、iCnt＞SEC(3.0)でもalpha=0.0を維持する。	*/
	/*		  │  描画(x, y, スプライト番号, alpha);																*/
	/*		  │  if(iCnt) { iCnt++; }																		*/
	/*		  │}																					*/
	/*		  本当はiCntをSEC(3.0)で止まる様に処理すれば良いだけなのですが、プログラム作成中に一時的に手抜きをしたい時などに簡単に書けるのは便利だと思います。			*/
	/*		//}}2016/03/29コメント追記																		*/
	/*                                                                  */
	/********************************************************************/

#ifndef MATH_H 
#define MATH_H

#ifdef UNIX
#include "errno.h"
#else
#include <errno.h>
#endif

#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus

//{{2015/11/24追加:M_E,M_PI等の定義を、clipfix.h⇒math.hへ移動しました。
// * Tue Nov 24 21:15:16 JST 2015 Naoyuki Sawa
// - M_E,M_PI等の定義を、clipfix.h⇒math.hへ移動しました。
// - 一部のシンボル名がBorland C++とPOSIXとで違っている事に気付いたので、両方のシンボル名で定義する事にしました。
//   また、Xcodeのマニュアルとも違っているシンボル名が有る事に気付いたので、両方のシンボル名で定義する事にしました。
//□参照資料:
//│「The Open Group Base Specifications Issue 7 IEEE Std 1003.1, 2013 Edition - math.h - mathematical declarations」
//│(http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/math.h.html)
#define M_E		2.71828182845904523536		//ｅ				POSIX
#define M_LOG2E		1.44269504088896340736		//log２(ｅ)			POSIX
#define M_LOG10E	0.434294481903251827651		//log10(ｅ)			POSIX
#define M_LN2		0.693147180559945309417		//logｅ(２)			POSIX
#define M_LN10		2.30258509299404568402		//logｅ(10)			POSIX
#define M_PI		3.14159265358979323846		//π				POSIX
#define M_PI_2		1.57079632679489661923		//π／２ 			POSIX
#define M_PI_4		0.785398163397448309616		//π／４			POSIX
#define M_1_PI		0.318309886183790671538		//１／π			POSIX
#define M_2_PI		0.636619772367581343076		//２／π			POSIX
#define M_1_SQRTPI	0.564189583547756286948		//１／√(π)			Borland C++ Compiler 5.5 <math.h> 特有? POSIXやXcodeでは定義されていないようです。
#define M_2_SQRTPI	1.12837916709551257390		//２／√(π)			POSIX
#define M_SQRT2		1.41421356237309504880		//    √(２)			POSIX
#define M_SQRT1_2	0.707106781186547524401		//１／√(２) = √(１／２)	POSIX
#define M_SQRT_2	M_SQRT1_2			//(同上)			Borland C++ Compiler 5.5 <math.h> ではこの名前になっています。
#define M_SQRT_1_2	M_SQRT1_2			//(同上)			Xcode Tools version 5.0 <math.h> ではこの名前になっているようです。	□参照資料:「OS X Man Pages - M_PI」https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/M_SQRT_1_2.3.html
//}}2015/11/24追加:M_E,M_PI等の定義を、clipfix.h⇒math.hへ移動しました。

extern double acos( double );
extern double asin( double );
extern double atan( double );
extern double atan2( double, double );
extern double ceil( double );
extern double cos( double );
extern double cosh( double );
extern double exp( double );
extern double fabs( double );
extern double floor( double );
extern double fmod( double, double );
extern double frexp( double, int * );
extern double ldexp( double, int );
extern double log( double );
extern double log10( double );
extern double modf( double, double * );
extern double pow( double, double );
extern double sin( double );
extern double sinh( double );
extern double sqrt( double );
extern double tan( double );
extern double tanh( double );

#ifndef DBL_LNG_TYPE 

#define DBL_LNG_TYPE 

typedef union {
    struct {
#ifdef BIG_ENDIAN
        unsigned long _LL;
        unsigned long _LH;
#else  
        unsigned long _LH;
        unsigned long _LL;
#endif 
    } st;
    double _D;
} DBL_LNG;

#endif

//{{2015/07/25追加:log2()を追加しました。実装は、cliplibc.cにあります。log2()は、C99で追加された関数です。「Lua 5.3.1」が、使用しています。
double log2(double x);
//}}2015/07/25追加:log2()を追加しました。実装は、cliplibc.cにあります。log2()は、C99で追加された関数です。「Lua 5.3.1」が、使用しています。

//{{2016/03/24追加:signbit(),copysign(),copysignf()を追加しました。round(),roundf(),nearbyint(),nearbyintf(),rint(),rintf(),lround(),lroundf(),lrint(),lrintf()を追加しました。
//□「Linux Programmer's Manual - SIGNBIT」(http://linuxjm.osdn.jp/html/LDP_man-pages/man3/signbit.3.html)より引用:
//│signbit()は、あらゆる種類の浮動小数点実数に対して適用可能な汎用的なマクロである。xの値の符号ビットがセットされている場合、非0の値を返す。
//│このマクロはx<0.0と全く同じではない。なぜなら、IEEE754の浮動小数点表現では0も符号を持つからである。-0.0<0.0という比較結果は偽(false)だが、signbit(-0.0)は非0の値を返す。	←と書いてあるが、簡単に実装するために((x)<0)とした。実用上はこれでも支障無いと思うし、実際の所当マクロを使う事が無い気もする。尚、floatに対しても適用される可能性が有る事を考慮して、余計なfloat⇒double変換を発生させないために、((x)<0.0)ではなく((x)<0)としておく事にした。
//│NaNと無限大には符号ビットがある。
#define signbit(x) ((x)<0)
//□「Linux Programmer's Manual - COPYSIGN」(http://linuxjm.osdn.jp/html/LDP_man-pages/man3/copysign.3.html)より引用:
//│関数copysign(),copysignf(),copysignl()は絶対値がxに等しく、符号ビットがyに等しい値を返す。
double copysign(double x, double y);				//⇒cliplibc.c
float copysignf(float x, float y);				//⇒framflt2.c
//long double copysignl(long double x, long double y);		//未対応
//□「Linux Programmer's Manual - ROUND」(http://linuxjm.osdn.jp/html/LDP_man-pages/man3/round.3.html)より引用:
//│これらの関数はxを最も近い整数値に丸める。
//│2つの整数の中間値の場合は、rint()のように最も近い偶数に丸めたりせずに、(現在の丸め方向に関係なく)0から遠い方に丸める(丸め方向についてはfenv()を参照)。
double round(double x);						//⇒cliplibc.c
float roundf(float x);						//⇒framflt2.c
//long double roundl(long double x);				//未対応
//□「Linux Programmer's Manual - RINT」(http://linuxjm.osdn.jp/html/LDP_man-pages/man3/rint.3.html)より引用:
//│関数nearbyint(),nearbyintf(),andnearbyintl()は、現在の丸め方向(fesetround()参照)で引き数を浮動小数点形式の整数に丸める。inexact例外を出さない。
//│関数rint(),rintf(),andrintl()も同じような動作をするが、結果が引き数と異なる場合にinexact例外(FE_INEXACT)を出す(この例外はfetestexcept()経由で確認可能)。
double nearbyint(double x);					//⇒cliplibc.c
float nearbyintf(float x);					//⇒framflt2.c
//long double nearbyintl(long double x);			//未対応
double rint(double x);						//⇒cliplibc.c
float rintf(float x);						//⇒framflt2.c
//long double rintl(long double x);				//未対応
//□「Linux Programmer's Manual - LROUND」(http://linuxjm.osdn.jp/html/LDP_man-pages/man3/lround.3.html)より引用:
//│これらの関数は最も近い整数に引き数を丸める。現在の丸め方向に関係なく、0から遠い方の最も近い整数に引き数は丸められる(現在の丸め方向についてはfenv()参照)。
//│関数round(),ceil()と違い、これらの関数の返り値の型は引き数の型と異なる点に注意すること。
long lround(double x);						//⇒cliplibc.c
long lroundf(float x);						//⇒framflt2.c
//long lroundl(long double x);					//未対応
//long long llround(double x);					//未対応
//long long llroundf(float x);					//未対応
//long long llroundl(long double x);				//未対応
//□「Linux Programmer's Manual - LRINT」(http://linuxjm.osdn.jp/html/LDP_man-pages/man3/lrint.3.html)より引用:
//│これらの関数は、現在の丸め方向に基づき、最も近い整数に引き数を丸める(現在の丸め方向についてはfesetround()を参照)。
//│rint()系の関数と違い、これらの関数の返り値の型は引き数の型と異なる点に注意すること。
long lrint(double x);						//⇒cliplibc.c
long lrintf(float x);						//⇒framflt2.c
//long lrintl(long double x);					//未対応
//long long llrint(double x);					//未対応
//long long llrintf(float x);					//未対応
//long long llrintl(long double x);				//未対応
//□「Linux Programmer's Manual - TRUNC」(http://linuxjm.osdn.jp/html/LDP_man-pages/man3/trunc.3.html)より引用:
//│これらの関数は絶対値がxより小さい一番近い整数値にxを丸める。
double trunc(double x);						//⇒cliplibc.c
float truncf(float x);						//⇒framflt2.c
//long double truncl(long double x);				//未対応
//}}2016/03/24追加:signbit(),copysign(),copysignf()を追加しました。round(),roundf(),nearbyint(),nearbyintf(),rint(),rintf(),lround(),lroundf(),lrint(),lrintf()を追加しました。

//{{2016/03/28追加:fdim(),fdimf(),fmin(),fminf(),fmax(),fmaxf(),fma(),fmaf()を追加しました。
//□「Linux Programmer's Manual - FDIM」(https://linuxjm.osdn.jp/html/LDP_man-pages/man3/fdim.3.html)より引用:
//│これらの関数は、二つの引き数間の正の差分max(x-y,0)を返す。
double fdim(double x, double y);					//⇒cliplibc.c
float fdimf(float x, float y);						//⇒framflt2.c
//long double fdiml(long double x, long double y);			//未対応
//□「Linux Programmer's Manual - FMIN」(https://linuxjm.osdn.jp/html/LDP_man-pages/man3/fmin.3.html)より引用:
//│これらの関数はxとyのうち小さい方の値を返す。
double fmin(double x, double y);					//⇒cliplibc.c
float fminf(float x, float y);						//⇒framflt2.c
//long double fminl(long double x, long double y);			//未対応
//□「Linux Programmer's Manual - FMAX」(https://linuxjm.osdn.jp/html/LDP_man-pages/man3/fmax.3.html)より引用:
//│これらの関数はxとyのうち大きい方の値を返す。
double fmax(double x, double y);					//⇒cliplibc.c
float fmaxf(float x, float y);						//⇒framflt2.c
//long double fmaxl(long double x, long double y);			//未対応
//□「Linux Programmer's Manual - FMA」(https://linuxjm.osdn.jp/html/LDP_man-pages/man3/fma.3.html)より引用:
//│fma()関数はx*y+zを計算する。結果は、一つの三項演算として現在の丸めモードにしたがって丸められる(fenv()参照)。
double fma(double x, double y, double z);				//⇒cliplibc.c
float fmaf(float x, float y, float z);					//⇒framflt2.c
//long double fmal(long double x, long double y, long double z);	//未対応
//}}2016/03/28追加:fdim(),fdimf(),fmin(),fminf(),fmax(),fmaxf(),fma(),fmaf()を追加しました。

#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus

#endif
