mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-28 12:14:43 +00:00
73 lines
No EOL
3 KiB
Markdown
73 lines
No EOL
3 KiB
Markdown
# module `unit`
|
|
|
|
The `unit` module is a module that defines units that are often used in numerical calculations as types.
|
|
Erg numeric types include `Nat`, `Int`, `Ratio`, and so on. However, these types do not have information about "what the numbers mean", so nonsense calculations such as adding meters and yards can be performed.
|
|
By using the `unit` module, you can avoid mistakes such as passing numbers with different units to functions.
|
|
Mistakes like this actually occur, and serious bugs such as [Mars probe missing due to wrong unit system](http://www.sydrose.com/case100/287/) can cause it.
|
|
You should use this module if you want your code to be more robust when doing numerical computations.
|
|
|
|
```python
|
|
{*} = import "unit"
|
|
|
|
x = 6m # equivalent to `x = Meter.new(6)`
|
|
t = 3s # equivalent to `t = Sec.new(3)`
|
|
# m/s is a velocity unit object, of type Velocity
|
|
print! x/t # 2m/s
|
|
print! x + 4m # 10m
|
|
print! x + 2s # TypeError: `+`(Meter, Sec) is not implemented
|
|
```
|
|
|
|
The objects `m`, `s`, and `m/s` are called unit objects. It has the meaning of 1m, 1s, 1m/s by itself. `m/s` can be said to be a unit object created by combining m and s.
|
|
|
|
In unit, the following units are defined as types. It is called SI (International System of Units).
|
|
|
|
* Length: Meter (unit constant: m)
|
|
* Mass: KiloGram (unit constant: kg, g = 0.001kg)
|
|
* Time: Sec (minute, hour, day, year, etc. have constants such as minute, hour, day, year generated from Sec)
|
|
* Current: Amper (unit constant: a)
|
|
* Temperature: Kelvin (unit constant: k, Fahren, Celsius types are also available and can be converted to each other)
|
|
* Amount of substance: Mol (unit constant: mol)
|
|
* Luminous intensity: Candela (unit constant: cd)
|
|
|
|
In addition, the types `Unit1`, `UnitMul`, and `UnitDiv` are defined, which can be used to create new units by combining basic types.
|
|
For example, `UnitDiv(Unit1, Sec)`, because the unit of frequency hertz (hertz) is defined as the reciprocal of the vibration period (seconds).
|
|
If you want to treat this type as a meaningful type (such as adding a dedicated method), you should create a [patch](./../../syntax/type/07_patch.md).
|
|
|
|
```python
|
|
Hertz = Patch UnitDiv(Unit1, Sec)
|
|
SquareMeter = Patch UnitMul(Meter, Meter)
|
|
```
|
|
|
|
Some auxiliary units are also predefined.
|
|
|
|
* Frequency: Hertz(hz)
|
|
* Force: Newton(newton)
|
|
* Energy: Joule(j)
|
|
* Power: Watt(w)
|
|
* Potential: Volt(v)
|
|
* Electrical resistance: Ohm(ohm)
|
|
* Velocity: Velocity(m/s)
|
|
* Area: SquareMeter(m^2)
|
|
* Volume: CubicMeter(m^3) (liter = 10e-3 m^3)
|
|
* Angle: Degree(deg) (rad = 180/pi deg)
|
|
* Length: Feet, Yard, Inch, Mile, Ly, Au, Angstrom
|
|
* Weight: Pound
|
|
|
|
It also defines a prefix.
|
|
|
|
* Femto = 1e-15
|
|
* Pico = 1e-12
|
|
* Nano = 1e-9
|
|
* Micro = 1e-6
|
|
* Milli = 1e-3
|
|
* Centi = 1e-2
|
|
* Deci = 1e-1
|
|
* Hecto = 1e+2
|
|
* Kilo = 1e+3
|
|
* Mega = 1e+6
|
|
* Giga = 1e+9
|
|
* Tera = 1e+12
|
|
* Peta = 1e+15
|
|
* Exa = 1e+18
|
|
|
|
*Contrary to the origin of the name, Erg basically adopts the MKS unit system. If you want the unit module of the CGS unit system, please use an external library ([cgs](https://github.com/mtshiba/cgs) etc.). |