37#define _PAI 3.14159265358979323846264338327950288
40#if defined(_UNICODE) && ! defined(_TnbUnit_SpecialChar_DISABLE)
44 #define _LITRE L"\x2113"
50 #define _LITRE _T("l")
159 { _T(
""), _T(
""), 1.0 },
160 { _T(
"Y"), _T(
"ヨタ"), 1.0E-24 },
161 { _T(
"Z"), _T(
"ゼタ"), 1.0E-21 },
162 { _T(
"E"), _T(
"エクサ"), 1.0E-18 },
163 { _T(
"P"), _T(
"ぺタ"), 1.0E-15 },
164 { _T(
"T"), _T(
"テラ"), 1.0E-12 },
165 { _T(
"G"), _T(
"ギガ"), 1.0E-9 },
166 { _T(
"M"), _T(
"メガ"), 1.0E-6 },
167 { _T(
"k"), _T(
"キロ"), 1.0E-3 },
168 { _T(
"d"), _T(
"デシ"), 1.0E+1 },
169 { _T(
"c"), _T(
"センチ"), 1.0E+2 },
170 { _T(
"m"), _T(
"ミリ"), 1.0E+3 },
171 { _T(
"μ"), _T(
"マイクロ"), 1.0E+6 },
172 { _T(
"n"), _T(
"ナノ"), 1.0E+9 },
173 { _T(
"p"), _T(
"ピコ"), 1.0E+12 },
174 { _T(
"f"), _T(
"フェムト"), 1.0E+15 },
175 { _T(
"a"), _T(
"アト"), 1.0E+18 },
176 { _T(
"z"), _T(
"ゼプト"), 1.0E+21 },
177 { _T(
"y"), _T(
"ヨクト"), 1.0E+24 },
179 { _T(
"Yi"), _T(
"ヨビ"), 1.0 / 1208925819614629174706176.0 },
180 { _T(
"Zi"), _T(
"ゼビ"), 1.0 / 1180591620717411303424.0 },
181 { _T(
"Ei"), _T(
"エクスビ"), 1.0 / (1ui64 << 60) } ,
182 { _T(
"Pi"), _T(
"ペビ"), 1.0 / (1ui64 << 50) },
183 { _T(
"Ti"), _T(
"テビ"), 1.0 / (1ui64 << 40) },
184 { _T(
"Gi"), _T(
"ギビ"), 1.0 / (1ui64 << 30) },
185 { _T(
"Mi"), _T(
"メビ"), 1.0 / (1ui64 << 20) },
186 { _T(
"Ki"), _T(
"キビ"), 1.0 / (1ui64 << 10) },
189 if ( i >= 0 && i < countof(A) )
272 bool HasPfCode(
void)
const {
return (m_code & PFCODE) != 0; }
277 int ToInt(
void)
const {
return m_code; };
291 void m_Test(LPCVOID u){ ASSERT(
false); }
294 double m_GetRevise(
const CCode& c)
const
296 const TUnitParam* P = c.HasPfCode() ? GetPfParam(c) : U::GetParam(c);
301 double m_GetCoefficient(
const CCode& c)
const
306 double a = GetPfParam(c)->doCoefficient;
308 loop ( i, U::RASING )
315 r = U::GetParam(c)->doCoefficient;
328 DEBUG_ONLY(m_Test(
this));
338 DEBUG_ONLY(m_Test(
this));
349 DEBUG_ONLY(m_Test(
this));
383 return m_value.
ToString(lpszFormat) + GetUnitMarkString(m_code);
418 return GetUnitMarkString(m_code);
428 return GetUnitJapanString(m_code);
439 if ( m_code != code )
441 m_value -= m_GetRevise(m_code);
442 m_value *= m_GetCoefficient(code) / m_GetCoefficient(m_code);
443 m_value += m_GetRevise(code);
594 u.m_value = v - u.m_value;
639 return m_value / u.
GetValue(m_code);
728 return U::GetKindString();
750 s = GetPfParam(code)->lpszMarkString;
751 s += U::GetParam(U::EUnitCode(0))->lpszMarkString;
755 s = U::GetParam(code)->lpszMarkString;
770 s = GetPfParam(code)->lpszJapanString;
771 s += U::GetParam(U::EUnitCode(0))->lpszJapanString;
775 s = U::GetParam(code)->lpszJapanString;
801 return t.GetValue().ToString(lpszFormat) + t.GetUnitJapanString();
820 return t.GetValue().ToString(lpszFormat) + t.GetUnitMarkString();
838 return T::GetKindString();
888 enum { KINDCODE =
'Di' };
924 { _T(
"m"), _T(
"メートル"), 1.0 },
925 { _T(
"in"), _T(
"インチ"), 39.37 },
926 { _T(
"ft"), _T(
"フィート"), 3.28084 },
927 { _T(
"yd"), _T(
"ヤード"), 1.09361 },
928 { _T(
"mile"), _T(
"マイル"), 0.000621 },
929 { _T(
"n.m."), _T(
"海里"), 0.000539 },
930 { _T(
"尺"), _T(
"尺"), 3.3 },
931 { _T(
"間"), _T(
"間"), 3.3 / 6.0 },
932 { _T(
"町"), _T(
"町"), 3.3 / 360.0 },
933 { _T(
"里"), _T(
"里"), 3.3 / 12960.0},
934 { _T(
"Å"), _T(
"オングストローム"), 1.0E+10 },
935 { _T(
"AU"), _T(
"天文単位"), 6.68459E-12 },
936 { _T(
"ly"), _T(
"光年"), 1.05700E-16 },
937 { _T(
"pc"), _T(
"パーセク"), 3.24078E-17 },
939 if ( code >= 0 && code < countof(A) )
1003 return r * 2 *
_PAI;
1064 CRealNumber r = 2 * A *
_PAI * (1 - a / 4 - (a * a) * 3 / 64 - (a * a * a) * 5 / 256);
1083 enum { RASING = 2 };
1092 enum { KINDCODE =
'Ar' };
1104 MM2 = CPfUnit::MILLI,
1105 CM2 = CPfUnit::CENTI,
1106 KM2 = CPfUnit::KIRO,
1120 { _T(
"㎡"), _T(
"平方メートル"), 1.0 },
1121 { _T(
"a"), _T(
"アール"), 0.01 },
1122 { _T(
"ha"), _T(
"ヘクトアール"), 0.0001 },
1123 { _T(
"in") _S2, _T(
"平方インチ"), 1550.0 },
1124 { _T(
"yd") _S2, _T(
"平方ヤード"), 1.19599 },
1125 { _T(
"acre"), _T(
"エーカー"), 0.000247 },
1127 if ( code >= 0 && code < countof(A) )
1220 return r * r *
_PAI;
1231 return x * y *
_PAI;
1249 enum { RASING = 3 };
1258 enum { KINDCODE =
'Cu' };
1271 MM3 = CPfUnit::MILLI,
1272 CM3 = CPfUnit::CENTI,
1273 KM3 = CPfUnit::KIRO,
1287 { _M3, _T(
"立方メートル"), 1.0 },
1288 { _T(
"in") _S3, _T(
"立方インチ"), 61023.6 },
1289 { _T(
"yd") _S3, _T(
"立方ヤード"), 1.30795 },
1290 { _T(
"bbl"), _T(
"バレル"), 6.28982 },
1291 { _LITRE, _T(
"リットル"), 1000.0 },
1292 { _DL, _T(
"デシリットル"), 10000.0 },
1293 { _T(
"cc"), _T(
"cc"), 1000000.0 },
1295 if ( code >= 0 && code < countof(A) )
1382 enum { KINDCODE =
'We' };
1395 MG = CPfUnit::MILLI,
1410 { _T(
"g"), _T(
"グラム"), 1.0 },
1411 { _T(
"t"), _T(
"トン"), 0.000001 },
1412 { _T(
"oz"), _T(
"オンス"), 35.274 * 0.001 },
1413 { _T(
"lb"), _T(
"ポンド"), 2.20462291 * 0.001 },
1414 { _T(
"ct"), _T(
"カラット"), 1.0 / 0.2 },
1415 { _T(
"貫"), _T(
"貫"), 0.001 / 3.750 },
1416 { _T(
"mon"), _T(
"匁"), 1.0 / 3.750 },
1418 if ( code >= 0 && code < countof(A) )
1482 enum { KINDCODE =
'Te' };
1504 { _T(
"℃"), _T(
"摂氏"), 1.0, 0 },
1505 { _T(
"゜F"), _T(
"華氏"), 9.0 / 5.0, 32, },
1506 { _T(
"K"), _T(
"ケルビン"), 1.0, 273.15 },
1508 if ( code >= 0 && code < countof(A) )
1571 enum { KINDCODE =
'Ti' };
1582 MSEC = CPfUnit::MILLI,
1596 { _T(
"s"), _T(
"秒"), 1.0 },
1597 { _T(
"m"), _T(
"分"), 1.0 / 60.0 },
1598 { _T(
"h"), _T(
"時"), 1.0 / 3600 },
1599 { _T(
"day"), _T(
"日"), 1.0 / (3600 * 24) },
1600 { _T(
"week"), _T(
"週"), 1.0 / (3600 * 24 * 7) },
1602 if ( code >= 0 && code < countof(A) )
1656 enum { RASING = 2 };
1665 enum { KINDCODE =
'Tt' };
1676 MSEC2 = CPfUnit::MILLI,
1690 { _T(
"s^2"), _T(
"秒^2"), 1.0 },
1691 { _T(
"m^2"), _T(
"分^2"), (1.0 / 60.0) * (1.0 / 60.0) },
1692 { _T(
"h^2"), _T(
"時^2"), (1.0 / 3600) * (1.0 / 3600) },
1693 { _T(
"day^2"), _T(
"日^2"), (1.0 / (3600 * 24)) * (1.0 / (3600 * 24))},
1694 { _T(
"week^2"), _T(
"週^2"), (1.0 / (3600 * 24 * 7)) * (1.0 / (3600 * 24 * 7))},
1696 if ( code >= 0 && code < countof(A) )
1793 enum { KINDCODE =
'Fr' };
1800 KHZ = CPfUnit::KIRO,
1801 MHZ = CPfUnit::MEGA,
1802 GHZ = CPfUnit::GIGA,
1816 { _T(
"Hz"), _T(
"ヘルツ"), 1.0 },
1818 if ( code >= 0 && code < countof(A) )
1927 enum { KINDCODE =
'De' };
1948 { _T(
"°"), _T(
"度"), 1.0 },
1949 { _T(
"\""), _T(
"秒"), 60.0 * 60.0 },
1950 { _T(
""), _T(
""),
_PAI / 180.0},
1952 if ( code >= 0 && code < countof(A) )
2051 double r = abs(dd) * 60 * 60 + abs(mm * 60) + ss;
2068 double r = dd * 60 * 60 + mm * 60 + ss;
2101 d.
Set(atan2(x, y), CValueDegree::RAD);
2120 d.
Set(atan2(x, y), CValueDegree::RAD);
2137 v1 = fmod(v1 + 360.0 * 1000.0, 360.0);
2138 v2 = fmod(v2 + 360.0 * 1000.0, 360.0);
2144 d.
Set(v1, CValueDegree::DEG);
2171 enum { KINDCODE =
'Pr' };
2193 { _T(
"mmHg"), _T(
"水銀柱ミリメートル"), 1.0 },
2194 { _T(
"Torr"), _T(
"トル"), 1.0 },
2195 { _T(
"inHg"), _T(
"水銀柱インチ"), 3.937E-02 },
2196 { _T(
"Pa"), _T(
"パスカル"), 133.3224 },
2198 if ( code >= 0 && code < countof(A) )
2262 enum { KINDCODE =
'Re' };
2283 { _T(
"%"), _T(
"パーセント"), 1.0 },
2284 { _T(
"割"), _T(
"割"), 0.1 },
2285 { _T(
""), _T(
""), 0.01 },
2287 if ( code >= 0 && code < countof(A) )
2351 enum { KINDCODE =
'A' };
2371 { _T(
"A"), _T(
"アンペア"), 1.0 },
2372 { _T(
"Bi"), _T(
"ビオ"), 0.1 },
2374 if ( code >= 0 && code < countof(A) )
2438 enum { KINDCODE =
'V' };
2445 MV = CPfUnit::MILLI,
2460 { _T(
"V"), _T(
"ボルト"), 1.0 },
2462 if ( code >= 0 && code < countof(A) )
2523 enum { KINDCODE =
' ' * 0x100 };
2542 { _T(
""), _T(
""), 1.0 },
2544 if ( code >= 0 && code < countof(A) )
#define loop(VAR, CNT)
loop構文.
static const TUnitParam * GetPfParam(EPfUnitCode code)
[取得] 接頭単位コードパラメータ取得
CStr ToString(LPCTSTR lpszFormat=NULL) const
[取得] 文字列作成
static const TUnitParam * GetParam(EUnitCode code)
[取得] コードパラメータ取得
static LPCTSTR GetKindString(void)
[取得] 単位種文字列取得
static const TUnitParam * GetParam(EUnitCode code)
[取得] コードパラメータ取得
static LPCTSTR GetKindString(void)
[取得] 単位種文字列取得
static const TUnitParam * GetParam(EUnitCode code)
[取得] コードパラメータ取得
static LPCTSTR GetKindString(void)
[取得] 単位種文字列取得
static const TUnitParam * GetParam(EUnitCode code)
[取得] コードパラメータ取得
static LPCTSTR GetKindString(void)
[取得] 単位種文字列取得
static const TUnitParam * GetParam(EUnitCode code)
[取得] コードパラメータ取得
static LPCTSTR GetKindString(void)
[取得] 単位種文字列取得
static const TUnitParam * GetParam(EUnitCode code)
[取得] コードパラメータ取得
static LPCTSTR GetKindString(void)
[取得] 単位種文字列取得
static const TUnitParam * GetParam(EUnitCode code)
[取得] コードパラメータ取得
static LPCTSTR GetKindString(void)
[取得] 単位種文字列取得
static const TUnitParam * GetParam(EUnitCode code)
[取得] コードパラメータ取得
static LPCTSTR GetKindString(void)
[取得] 単位種文字列取得
static const TUnitParam * GetParam(EUnitCode code)
[取得] コードパラメータ取得
static LPCTSTR GetKindString(void)
[取得] 単位種文字列取得
static const TUnitParam * GetParam(EUnitCode code)
[取得] コードパラメータ取得
static LPCTSTR GetKindString(void)
[取得] 単位種文字列取得
static const TUnitParam * GetParam(EUnitCode code)
[取得] コードパラメータ取得
static LPCTSTR GetKindString(void)
[取得] 単位種文字列取得
static const TUnitParam * GetParam(EUnitCode code)
[取得] コードパラメータ取得
static LPCTSTR GetKindString(void)
[取得] 単位種文字列取得
static const TUnitParam * GetParam(EUnitCode code)
[取得] コードパラメータ取得
static LPCTSTR GetKindString(void)
[取得] 単位種文字列取得
static const TUnitParam * GetParam(EUnitCode code)
[取得] コードパラメータ取得
static LPCTSTR GetKindString(void)
[取得] 単位種文字列取得
bool operator==(const CCode &c) const
[確認] 比較
int ToInt(void) const
[取得] intで取得
CCode(EPfUnitCode code)
コンストラクタ
U::EUnitCode EUnitCode
入れ子型名再定義
void SetInt(int i)
[設定] intで設定
bool operator!=(const CCode &c) const
[確認] 比較
CCode(EUnitCode code)
コンストラクタ
bool HasPfCode(void) const
[確認] 接頭単位コード保持?
CValueUnitT & operator/=(const CRealNumber &v)
[計算] 割算代入.
CValueUnitT(const CRealNumber &v)
コンストラクタ.
friend CValueUnitT operator-(const CRealNumber &v, const CValueUnitT &u)
[計算] 減算.
void Set(const CRealNumber &v)
[代入] 値設定 指定の値を設定します。単位は変化しません。
CValueUnitT & operator*=(const CRealNumber &v)
[計算] 掛算代入.
CValueUnitT & operator-=(const CRealNumber &v)
[計算] 減算代入.
CValueUnitT operator+(const CRealNumber &v) const
[計算] 加算.
CStr GetUnitJapanString(void) const
[取得] 単位意味文字列取得.
CValueUnitT & operator-=(const CValueUnitT &u)
[計算] 単位付値減算代入.
CCode GetUnitCode(void) const
[取得] 単位コード取得.
static CStr GetUnitMarkString(CCode code)
[取得] 単位マーク文字列取得.
CValueUnitT operator-(const CValueUnitT &u) const
[計算] 単位付値減算.
CRealNumber GetValue(CCode code) const
[取得] 値取得(単位指定).
CRealNumber operator/(const CValueUnitT &u) const
[計算] 単位付値割算.
bool operator>=(const CValueUnitT &t) const
[確認] 比較
CRealNumber GetValue(void) const
[取得] 値取得.
bool operator>(const CValueUnitT &t) const
[確認] 比較
bool operator==(const CValueUnitT &t) const
[確認] 比較
bool operator!=(const CValueUnitT &t) const
[確認] 比較
friend CValueUnitT operator*(const CRealNumber &v, const CValueUnitT &u)
[計算] 掛算.
static CStr GetUnitJapanString(CCode code)
[取得] 単位意味文字列取得.
CValueUnitT operator+(const CValueUnitT &u) const
[計算] 単位付値加算.
static DWORD GetUnitKindCode(void)
[取得] 単位種コード取得
CStr GetUnitMarkString(void) const
[取得] 単位マーク文字列取得.
static CStr GetUnitKindString(void)
[取得] 単位種文字列取得
bool operator<=(const CValueUnitT &t) const
[確認] 比較
CValueUnitT & ToUnit(CCode code)
[変換] 単位変更.
void Set(const CRealNumber &v, CCode code)
[代入] 値、単位設定 指定の値、単位を設定します。
CValueUnitT & operator+=(const CValueUnitT &u)
[計算] 単位付値加算代入.
CValueUnitT & operator+=(const CRealNumber &v)
[計算] 加算代入.
CStr ToString(LPCTSTR lpszFormat=NULL) const
[取得] 文字列で取得
CValueUnitT(const CRealNumber &v, CCode code)
コンストラクタ.
friend CValueUnitT operator+(const CRealNumber &v, const CValueUnitT &u)
[計算] 加算.
CValueUnitT operator/(const CRealNumber &v) const
[計算] 割算.
CValueUnitT operator-(const CRealNumber &v) const
[計算] 減算.
bool operator<(const CValueUnitT &t) const
[確認] 比較
CValueUnitT(void)
コンストラクタ.
CStr ToString(CCode code, LPCTSTR lpszFormat=NULL) const
[取得] 文字列で取得(単位指定あり)
CValueUnitT operator*(const CRealNumber &v) const
[計算] 掛算.
CRealNumber operator*(const CValueTime &t, const CValueFrequency &f)
[計算] 掛算 (値 = 時間 × 周波数)
CValueUnitT< CUnitTemperature > CValueTemperature
温度管理クラス
CValueDistance CalcSlantingDistance(const CValueDistance &x, const CValueDistance &y)
[計算] 斜め距離計算 (√(水平距離^2 + 垂直距離^2))
CValueDistance CalcEllipseDistance_t3(const CValueDistance &x, const CValueDistance &y)
[計算] 楕円周囲長計算 (type3)
CRealNumber tan(const CValueDegree &d)
[計算] tan (値 = tan(角度))
CValueArea CalcCircleArea(const CValueDistance &r)
[計算] 円面積計算 (π × 半径 × 半径)
CValueDistance CalcEllipseDistance_t2(const CValueDistance &x, const CValueDistance &y)
[計算] 楕円周囲長計算 (type2)
CValueUnitT< CUnitCubic > CValueCubic
体積管理クラス
CValueUnitT< CUnitDistance > CValueDistance
距離管理クラス
CStr GetUnitKindString(const T &t)
[取得] 単位種文字列取得
CValueArea CalcEllipseArea(const CValueDistance &x, const CValueDistance &y)
[計算] 楕円面積計算 (π × 水平半径 × 垂直半径)
CRealNumber sin(const CValueDegree &d)
[計算] sin (値 = sin(角度))
CValueUnitT< CUnitTime > CValueTime
時間管理クラス
CStr ToStringWithUnitMark(const T &t, LPCTSTR lpszFormat=NULL)
[作成] 文字列作成
CRealNumber cos(const CValueDegree &d)
[計算] cos (値 = cos(角度))
CValueDistance CalcCircleDistance(const CValueDistance &r)
[計算] 円周囲長計算 (2 × π × 半径)
CValueUnitT< CUnitWeight > CValueWeight
重量管理クラス
CStr ToStringWithJapanUnit(const T &t, LPCTSTR lpszFormat=NULL)
[作成] 文字列作成
CValueDegree CalcDegreeDifference(const CValueDegree &d1, const CValueDegree &d2)
[計算] 角度の開き計算.
CRealNumber cosh(const CValueDegree &d)
[計算] cosh (値 = cosh(角度))
CValueUnitT< CUnitDegree > CValueDegree
角度管理クラス
CValueUnitT< CUnitRatio > CValueRatio
割合管理クラス
CValueFrequency operator/(const CRealNumber &v, const CValueTime &t)
[計算] 割算 (周波数 = 値 ÷ 時間)
CRealNumber sinh(const CValueDegree &d)
[計算] sinh (値 = sinh(角度))
CValueTime sqrt(const CValueTime2 &t2)
[計算] 平方根 (時間 = √(時間^2))
CValueUnitT< CUnitTime2 > CValueTime2
時間^2管理クラス
CValueDegree MakeDegree(BYTE dd, BYTE mm, double ss)
[計算] 角度(度,分,秒)計算.
CValueUnitT< CUnitFrequency > CValueFrequency
周波数管理クラス
CValueUnitT< CUnitPressure > CValuePressure
圧力管理クラス
CValueDistance CalcRightTriangleHeight(const CValueDistance &di, const CValueDegree &de)
[計算] 直角三角形の高さ計算
CValueDegree CalcDegreeAverage(const CValueDegree &d1, const CValueDegree &d2, double r1=1.0, double r2=1.0)
[計算] 角度の平均計算.
CValueDistance CalcEllipseDistance(const CValueDistance &x, const CValueDistance &y)
[計算] 楕円周囲長計算 (π × √( 2 (水平半径^2 + 垂直半径^2))
CValueUnitT< CUnitArea > CValueArea
面積管理クラス
CValueUnitT< CUnitAmpere > CValueAmpere
電流管理クラス
CValueUnitT< CUnitDummy > CValueNonUnit
単位なし管理クラス
CValueArea CalcTriangleArea(const CValueDistance &x, const CValueDistance &y)
[計算] 三角面積計算 (底辺 × 高さ ÷ 2)
CRealNumber tanh(const CValueDegree &d)
[計算] tanh (値 = tanh(角度))
CValueUnitT< CUnitVolt > CValueVolt
電圧管理クラス
DWORD GetUnitKindCode(const T &t)
[取得] 単位種コード取得
void Swap(T &t1, T &t2)
[変換] スワッパー.
LPCTSTR lpszMarkString
単位記号文字列
LPCTSTR lpszJapanString
単位日本語文字列