数量と単位

要約:
  • 数量は、数値および対応する測定単位が一体となったものです。
  • Curl® 言語では、SI 標準単位系をはじめとする、さまざまな測定単位をサポートしています。
  • 数量の数値は、double または float として格納されます。単なる double または float も数量と見なされます。
  • 数量はそれぞれ特定のデータ型に属します。各数量型には、適合する測定単位で表された値を代入することができます。
  • 同じ型を使用して、数量の加算、減算、比較をすることができます。また、同じ型または異なる型の数量の乗算、除算を行うことができます。
Curl 言語では、数量という特別な型の値をサポートします。数量は、いくつかの対応する測定単位と一体になった数値として指定できます。たとえば、Curl 式で 3centimeters または 3cm という表記を使用して、3 センチメートルの距離を表すことができます。コンパイラで、コード内の数量が認識され、適切に処理されます。
Curl 言語の数量には、測定単位が値の一部として含まれているので、さまざまな測定単位を持つ値を簡単に操作できます。たとえば、4 センチメートル (4cm) と 2 インチ (2in) のような数量を簡単に比較できます。単位系の間の変換は意識させません。
指定できる測定単位は、Curl 言語に組み込まれています。次のリストに、サポートされている単位の一部を示します。Curl 言語では、SI 規格 (国際単位系) の単位の大部分をはじめとする、さまざまな単位をサポートしています。詳細なリストについては、「サポートされている単位」のセクションを参照してください。
2.75meter             || 2.75 meters (distance)
3degree               || 3 degrees (angle)
6.8second             || 6.8 seconds (time)
0.7gram               || 0.7 grams (mass)
8Hz                   || 8 hertz (frequency)
Curl 言語に組み込まれている各測定単位には、name とオプションの symbol があります。たとえば、メートルの測定単位には、名前 meter と記号 m があります。数量では名前または記号を使用できます。
次に例を示します。
2m                  || 2 meters (distance)
2meter              || 2 meters (distance)
一部の測定単位には、数量でも使用できる 1 つ以上の別名があります。たとえば、ポンド (質量の単位) の測定単位には、以下のように pound という名前があり、さらに別名として lblbsdry-pounddry-poundsavoirdupois-pound、および avoirdupois-pounds もあります。
9pound              || 9 pounds (mass)
9lb                 || 9 pounds (mass)
9lbs                || 9 pounds (mass)
9dry-pound          || 9 pounds (mass)
9dry-pounds         || 9 pounds (mass)
9avoirdupois-pound  || 9 pounds (mass)
9avoirdupois-pounds || 9 pounds (mass)
サポートされている単位の複数形を使用するときは、名前、記号、および別名の区別が重要になります。測定単位を複数として表したい場合は、英語の規則に従って単位の名前を複数にしてください。次に例を示します。
2meters             || 2 meters (distance)
9pounds             || 9 pounds (mass)
10feet              || 10 feet (distance)
11inches            || 11 inches (distance)
Curl 言語では、記号または別名の複数形はありません。このため、メートルの記号 (m) の複数形を表すつもりで ms を使用すると、ミリ秒を表してしまうなどのあいまいさが生じることはありません。
測定単位を組み合わせて、複雑な数量を形成することもできます。次の例は、複雑な数量をいくつか示しています。
2m                  || 2 meters
2(m^2)              || 2 meters squared
2(m/s)              || 2 meters per second
2(m/s^2)            || 2 meters per second squared
3.5(ft*lb)          || 3.5 foot-pounds
使用可能な測定単位のリストについては、「サポートされている単位」のセクションの表を参照してください。
注意: 数量の値は double または float として格納されるので、数量には、精度に関して他の浮動小数点値と同じ制限があります。

単位プレフィックス

メートル法を採用している場合は、プレフィックスを使用すれば、単位の尺度を変更できます。たとえば、centi プレフィックスと meter 単位を使用すれば、centimeter 単位を形成できます。単位の前にプレフィックスを付けることで、単位の尺度を変更します。たとえば、centi プレフィックスでは、単位が 10^-2 倍または 0.01 倍になります。一般的な単位プレフィックスには、以下のものがあります。
こうした単位プレフィックスには、それぞれ長い形式 (メートル法の名前で使用可能) と短い形式 (上記のかっこ内の単位記号で使用可能) があります。
注意: 単位名、記号、単位プレフィックスはすべて大文字と小文字が区別されます。
次のコードでは、単位プレフィックスありとなしの数量をいくつか示しています。
2meter          || 2 meters
12centimeter    || 12 centimeters
13millimeter    || 13 millimeters
2m              || 2 meters
12cm            || 12 centimeters
13mm            || 13 millimeters
7grams          || 7 grams
14kilograms     || 14 kilograms
7g              || 7 grams
14kg            || 14 kilograms
単位プレフィックスの詳細なリストについては、「サポートされている単位プレフィックス」のセクションを参照してください。

数量構文

Curl 言語の数量構文は、次のとおりです。項目間に空白文字がないため、山かっこで項目を囲んでいます。
<value><tag> または <value>(<tag>)
説明:
注意: 値が float の場合や tag が複雑な測定単位の場合は、tag をかっこで囲む必要があります。
Curl 言語のこのリリースでは、単位を -8 乗より小さくすることや、7 乗より大きくすることはできません。たとえば、5(m^12) または 5(m^-12) にすることはできません。計算の中間結果がこうした累乗を超えないように注意する必要があります。たとえば、次のように宣言されているとします。
{let x:any = 6(m^6)}
{let y:any = 7(m^6)}
{let z:any = 3(m^5)}
ここで、次の計算を行うとします。
{value x * y / z}
この場合は、xy の中間結果が 42(m^12) となり、累乗の単位の許容範囲を超えているため、エラーになります。ただし、次の順序で計算したとします。
{value x / z * y}
この場合は、エラーが発生せず、結果が 21(m^7) になります。
注意: 数量リテラルの <value><tag> または (<tag>) の間、あるいは複雑な測定単位の中では、空白文字を使用できません。たとえば、4(m^-2) は有効な数量ですが、4(m^-2) は有効な数量ではありません。

数量の表示

Curl 言語の内部では、SI 基本単位を使用して数量を格納しています。次の表に、SI 基本単位とそのそれぞれに関連付けられている数量の型を示します。
単位記号単位名数量の型
radラジアンAngle
mメートルDistance
cdカンデラIntensity
gグラムMass
sTime
double 型や float 型の普通の数値も数量ですが、そうした数値には対応する単位がないので、単位なし数量といいます。単位なし数量の Fraction 型と Percent 型は、double 型の別名です。
他の数量の型の場合、Curl 言語では、SI 基本単位の組み合わせが使用されます。たとえば、Curl 言語では、Acceleration 数量が (m/s^2) として格納されます。
数量の値を表示する場合、数量は、該当する数量の型の基本単位を使用してフォーマットされます。つまり、数量は、値を指定する際に使用した可能性がある単位とは無関係に SI 基本単位で表示されるということです。次に例を示します。

例: 長さの単位の表示
{text 1inch displays as ... {value 1inch}}

{text 1foot displays as ... {value 1foot}}

{text 1meter displays as ... {value 1meter}}

{text 1mile displays as ... {value 1mile}}
Distance をインチで表示する場合のように、SI 基本単位で構成されていない測定単位で数量を表示するには、対象の単位の 1 で除算、たとえば距離を 1inch で除算する必要があります。この結果、元の数量のインチ数が単位なし数値として得られます。

例: 異なる単位での長さの表示
{format "%g is equal to %.2g inches", 10cm, 10cm/1inch}

{format "%g is equal to %g inches", 1yard, 1yard/1inch}
詳細については、「数量の変換」を参照してください。

組み込みの数量型

Curl 言語には数多くの数量型が 組み込まれています。以下にそれぞれをその標準単位と共に示します。
これらの型の Float... バージョンもありますが、64 ビット double ではなく 32 ビット float で表されています。たとえば、FloatDistance などがあります。
こうした数量型を使用して、変数や定数を作成することもできます。次のコードでは、このようなデータ型の一部を使用して、数多くの数量の宣言や初期化を実行しています。
{let a:Angle = 2degrees}
{let m:Mass = 6grams}
{let r:Resolution = 300(dots/inch)}
{let g:Acceleration = 32(ft/s^2)}
次の例に示すように、isa プリミティブを使用すれば、数量の型を確認できます。

例: isa と数量の使用
{let alpha:Angle = 0.5rad}         || 0.5 radians (angular measurement)
{paragraph "alpha isa Angle" is...} {value alpha isa Angle}
{paragraph "alpha isa Distance" is...} {value alpha isa Distance}
数量式で type-of プリミティブを使用すると役に立つ場合もあります。このプリミティブでは、式の型が名前付きの数量型のいずれかであるかどうかを示すことができます。あるいは、標準単位の特定の組み合わせによって生成された型として式の型を表すことができます。次に例を示します。

例: type-of と数量の使用
{let rate:Speed = 55mph,
    time:Time = 1hr + 15min}
{paragraph rate * time is of type {type-of rate * time}}
{paragraph rate / time is of type {type-of rate / time}}
{paragraph time / rate is of type {type-of time / rate}}
{paragraph time * time is of type {type-of time * time}}
isatype-of の詳細については、「データ型での作業」を参照してください。次のセクション「数量型の作成」では、type-of を使用して既存の単位の組み合わせから新しいデータ型を作成する方法も示します。

数量型の作成

数量型を作成するには、type-of を使用します。
{type-of example-value}
ここで、example-value には、適切な型の値を指定します。
たとえば、次の定義は、Curl 言語に組み込まれている定義の中にあります。
{let public constant Distance:Type={type-of 1m}}
{let public constant FloatDistance:Type={type-of 1f(m)}}
{let public constant Time:Type={type-of 1s}}
{let public constant Angle:Type={type-of 1rad}}
{let public constant Mass:Type={type-of 1g}}
{let public constant Intensity:Type={type-of 1cd}}
{let public constant PixelDistance:Type={type-of 1px}}
{let public constant EmDistance:Type={type-of 1em}}
type-of の引数には、右かっこ、単位式、および左かっこから成る複雑な測定単位も使用できます。単位式は、以下の演算子を使用して結合された単位と指数で構成されています。
演算子説明
*乗算(m*s) (距離/時間)
/除算(1/s) (周波数)
^べき関数 (第 2 オペランドは必ず整数)(m^2) (面積)
複雑な単位式には、空白文字を使用できません。たとえば、1(m*s) は有効な数量ですが、1(m*s) は有効な数量ではありません。次のコードでは、Force をユーザー定義の数量型として定義する方法を示しています。
{let constant Force:Type = {type-of 1(kg*m/s^2)}}

演算の数量

数多くの Curl 言語演算子で数量を使用できます。これにより、数量の加算、減算、乗算、比較などのアクションを実行できます。そのような演算を行う際、数量の測定単位は同じでなくてもかまいませんが、両方が同じ数量型を表すように、適合する測定単位である必要があります。たとえば、次の例に示すように、どのような単位を使用して値を表しても、2 つの Distance 数量を加算できます。

例: 数量の加算、減算、および比較
|| Add two distances
{value 1meter + 5centimeters}

|| Subtract two times
{value 1minute - 15seconds}

|| Compare two velocities
Is 55mph greater than 70km/hr? ... {value 55mph > 70(km/hr)}
ただし、DistanceTime のような異なる基本数量型を表す、適合しない単位を持つ 2 つの数量の加算、減算、または比較はできません。そのような式に関係する単位を確実に適合させることができない場合、その操作はエラーになります。次に例を示します。
6kg + 2deg

SyntaxError:'2 つの数量の型が同じ場合にしか数量を加算できません。'
数量の加算や減算と異なり、乗算と除算では、そのオペランドを同じ型にする必要はありません。したがって、同じ数量型または異なる数量型の数量の乗算または除算ができるので、次の例に示すように、結果は適切な型になります。

例: 数量の乗算と除算
|| Multiply 10 meters by 2 meters to get a result in square meters
{value 10meters * 2meters}

|| Divide 10 meters by 2 seconds to get a result of type Velocity
|| in units of meters/second
{value 10meters / 2seconds}
数値型の単位なし数量も、乗算または除算の演算で同様に any 型の数量と組み合わせることができます。ただし、加算、減算、または比較の演算では、単位なしの値を非単位なし数量型の値と組み合わせることはできません。これは、それらの値が根本的に異なる型を表すためです。次の例に、単位付き数量と単位なし数量に関する有効な演算をいくつか示します。

例: 単位付き数量と単位なし数量の有効な演算
|| Multiply 2 meters by 3
{value 2m * 3}

|| Divide 12 seconds by 4
{value 12seconds / 4}

|| Since "10%" is internally converted to 0.10,
|| 25 and 10% both represent unitless quantities,
{value 25 + 10%}
数量は、値を指定するために使用した単位に関係なく、SI 基本単位を使用して表されます。たとえば、インチで表された数量をヤードに加算する場合は、実行環境で結果がメートル (距離数量の SI 基本単位) で返されます。
次の例では、数量の有効な操作の結果が基本単位で表示されるようすを示しています。

例: 基本単位で表示される数量の演算結果
|| Add 1 meter and 1 inch
{value 1m + 1in}

|| Add 1 inch and 1 meter
{value 1in + 1m}

|| Subtract 1 inch from 1 meter
{value 1m - 1in}

|| Multiply 2 ft by 3 ft
{value 2ft * 3ft}

|| Multiply 50 miles by 2 hours
{value 50mi / 2hr}
次の表に、数量をサポートする演算子を示します。
演算子説明
-単項否定
*乗算
/除算
+加算
-減算
==等しい
!=等しくない
<より小さい
>より大きい
<=以下
>=以上
演算子の詳細については、「演算子」の章を参照してください。
浮動小数点数の演算と同様に、数量の演算は浮動小数点四則演算の規則に左右されます。たとえば、ゼロでは除算できません。ゼロで除算した場合、次のように <infinity>nan などの非数値の結果が表示されます。

例: 数量 0 での除算
|| Divide 7 meters by 0 seconds
{value 7m / 0s}

数量と数値との比較

前のセクションで示したように、根本的に異なる数量型の数量 (つまり、同じ基本単位で表現できない数量) は比較できません。たとえば、距離数量をゼロと比較すると、エラーになります。
{value
    let x:Distance = 6ft
    x > 0
}

SyntaxError:'2 つの数量の型が同じ場合にしか数量を比較できません。'
数値でない数量を数値と比較するには、その数値を矛盾のない数量に変換するか、数量を単位なし数量に変換する必要があります。
数値 0 を適切な数量に変換するには、適切な単位サフィックスを付加します。このようにして数量を比較する方法が最も安全なのは、x の型情報を保持して暗黙的に確認するためです。したがって、先ほどの例を修正するには、両方の値を距離にして、x0ft と比較します。

例: 適合する 2 つの数量の比較
{let x:Distance = 6ft}
Is x greater than 0 feet? ... {value x > 0ft}
必要に応じて、数量から数値を抽出するには、適合する単位で除算すれば、単位なしの指数が得られます。データ型変換の例については、「数量の変換」を参照してください。
さらに、任意の数量から数値を抽出する特別な SI-value プロシージャがあります。このプロシージャでは、数量が基本単位によって表されている場合、その値の数値部分が示されます。たとえば、{SI-value 6ft} では、ftDistance 数量型の単位であるため、純粋な数値として 6 フィートのメートル数が得られます。この場合、meter が基本単位です。

例: 数量の数値の取得
{let x:Distance = 6ft}

The value of x is {value x}

|| The numerical value of x
The number of meters in x is {value x/1m}.

|| This will produce the same value
The SI value of x is {SI-value x}.

Is x's numerical value greater than 0? ... {value {SI-value x} > 0}

数量での null の使用

Curl 言語の数量では、オブジェクトが作成されません。代わりに、数量は double または float と同様に数値として格納されます。結果として、数量には null を代入できません。同様に、数量を null と比較することもできません。数量型の変数が、宣言されたときに明示的に初期化されていない場合、その変数は、適切な測定単位と共に、null ではなくゼロに暗黙的に初期化されます。