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,",", ",";
}