度分秒の四則演算
頭文字 b のメモリが、度分秒を扱えます。
度分秒の値のセットや計算は、下の例のように行ないます。

sorc 度分秒
//
// 12.34567 は
// 12度34分56.7秒と見なす。
//
type b = dms,deg;

//--------------------
// 代入 b1=12.34567
//--------------------
operat b=( dms )
{
	deg = todeg( dms );
	if ( deg==0 ){
		bb.dms = 0;
		bb.deg = 0;
	}else{
		bb.dms = dms;
		bb.deg = deg;
	}
	ret bb;
}

//--------------------
// 度分秒+度分秒
//--------------------
operat +( b1, b2 )
{
	bb.deg = b1.deg + b2.deg;
	bb.dms = todms( bb.deg );
	ret bb;
}

//--------------------
// 度分秒-度分秒
//--------------------
operat -( b1, b2 )
{
	bb.deg = b1.deg - b2.deg;
	bb.dms = todms( bb.deg );
	ret bb;
}

//--------------------
// 度分秒xN
//--------------------
operat *( b1, nn )
{
	bb.deg = b1.deg * nn;
	bb.dms = todms( bb.deg );
	ret bb;
}

//--------------------
// Nx度分秒
//--------------------
operat *( nn, b2 )
{
	ret ( b2*nn );
}

//--------------------
// 度分秒/N
//--------------------
operat /( b1, nn )
{
	bb.deg = b1.deg / nn;
	bb.dms = todms( bb.deg );
	ret bb;
}

//--------------------
// -度分秒
//--------------------
operat -( b1 )
{
	bb.dms = -b1.dms;
	bb.deg = -b1.deg;
	ret bb;
}

//--------------------
// +度分秒
//--------------------
operat +( b1 )
{
	ret b1;
}

//--------------------
// 度分秒→度
//--------------------
func todeg( a1 )
{
	sec = a1 % 0.01;

	// 誤差対策
	if ( 0.01-abs(sec)<1e-13 ){
		sec = 0;
	}
	a1  = a1 - sec;
	min = a1 % 1.00;
	a1  = a1 - min;
	sec = sec * 10000;
	min = min * 100;
	if ( sec>=60 || min>=60 ){
		err("分秒が60以上.");
		a2 = 0;
	}else{
		a2 = a1+min/60+sec/3600;
	}
	ret a2;
}

//--------------------
// 度→度分秒
//--------------------
func todms( a1 )
{
	sec = a1 % (1/60);

	//誤差対策
	if ( 1/60-abs(sec)<1e-13 ){
		sec = 0;
	}
	a1  = a1 - sec;
	min = a1 % 1.00;
	a1  = a1 - min;
	ret a1+min*0.6+sec*0.36;
}

//------------------------
// 度分秒を扱うメモリへの
// 代入なしでの演算に使う
// dms(12.3030)/2
//   → 6.1515
//------------------------
func dms( a1 )
{
	bb = a1;
	ret bb;
}

setbtn{
	4, "b", "b";
	6, "dms", "dms(";
	10,",", ",";
}