GNU Units

GNU Units 是一款用于单位换算的跨平台计算机程序。它拥有一个庞大的度量衡单位数据库，包含了各种非惯用单位与历史计量单位。例如，它能轻松换算“弗隆每两周”的速度，或是“吨每英亩”的压力。输出单位会自动进行一致性检查，这使得复杂表达式的单位换算验证变得简单可靠。

## 历史

GNU Units 由 Adrian Mariano 编写，旨在实作 Unix 操作系统中内建的 units 工具。该程式最初采用宽松的授权条款，后来 GNU 版本改为 GPL 授权，不过 FreeBSD 专案仍维护着一份授权变更前的自由分支版本。

### Unix 工具

原始的 units 程式自早期的 贝尔实验室版本以来，一直是 Unix 的标准工具。

类似于原始版本的源代码可从 Heirloom 专案取得。

### GNU 实作

GNU units 在原版基础上扩充了多项功能，包括：

- 指数可使用 `^` 或 `**` 编写。
- 若使用 `^` 或 `**`，指数可大于 9。
- 支援有理数与小数指数。
- 支援单位加总（例如：`btu + ft lbf`）。
- 支援换算至单位总和（称为“单位列表”，例如将度数换算为度、分、秒）。
- 支援倒数维度单位的换算（例如：`S` 换算至 `megohm`）。
- 支援括号进行运算分组，使复杂表达式更直观。
- 支援计算单位根（例如：`sqrt((lbf/inch) / lb)`）。
- 支援仿射单位转换（例如：°F 转 °C）。
- 内建 sin、cos、ln、log、log2 等数学函数。
- 内建用于更新汇率的 Python 脚本。

单位定义（包含非线性转换与单位列表）皆可由使用者自订扩充。

纯文字格式的数据库档案 definitions.units 本身就是一份极佳的参考资料，其中包含详尽的注解与参考文献。

### 其他实作

UDUNITS 是另一个类似的工具程式，不同之处在于它提供了程式设计的函式库界面，并具备日期转换功能。UDUNITS 被视为 netCDF 档案变数单位换算的“事实标准”程式与函式库。

### 版本历史

GNU Units 2.19 版于 2019 年 5 月 31 日发布，以对应2019年国际单位制基本单位重新定义；2.14 版（2017 年 3 月 8 日）修复了若干小错误并改进了 Windows 平台的编译支援。2.10 版（2014 年 3 月 26 日）加入了大于 1 的有理数指数支援，以及将互动式会话纪录储存至档案的功能。自 2.10 版起，专案官网提供 32 位元 Windows 二进制发行版（2008 年起作为 GnuWin32 专案的一部分，已提供 1.87 版的 32 位元 Windows 移植版）。

2.02 版（2013 年 7 月 11 日）加入了十六进制浮点数输出及其他格式化选项。

2.0 版（2012 年 7 月 2 日）新增了转换至单位总和的功能（如“时与分”或“英尺与英寸”），并支援 UTF-8 编码。此外，也加入了对地区特定单位定义的支援，修改了非线性单位的定义语法，并新增了选择性的定义域与值域规范。标准与个人单位资料档的命名有所变更，汇率定义改置于独立档案中，并新增了用于更新汇率的 Python 脚本。

详细版本历史请见源代码包中的 NEWS 档案。

## 用法

Units 会分两行输出换算结果。通常第一行（乘法）是预期结果；第二行则是该换算的除法表示法。

Units 亦可作为通用科学计算机使用，内建多种数学函数，如 sin、cos、atan、ln、exp 等。

若尝试转换不相容的量测单位，units 会显示一致性错误（conformability error）讯息，并显示每个量测单位的化简形式。

## 范例

以下范例基于 GNU units 2.10 版。

### 互动模式

```
Currency exchange rates from www.timegenie.com on 2014-03-28
2729 units, 92 prefixes, 77 nonlinear units

You have: 10 furlongs
You want: miles
        * 1.25
        / 0.8
You have: 1 gallon + 3 pints
You want: quarts
        * 5.5
        / 0.18181818
You have: sqrt(meter)
              ^
Unit not a root
You have: sqrt(acre)
You want: ft
        * 208.71033
        / 0.0047913298
You have: 21 btu + 6500 ft lbf
You want: btu
        * 29.352939
        / 0.034068139
You have: _
You want: J
        * 30968.99
        / 3.2290366e-005
You have: 3.277 hr
You want: time
        3 hr + 16 min + 37.2 sec
You have: 1|2 inch
You want: cm
        * 1.27
        / 0.78740157
```

底线（'_'）用于表示上一次成功换算的结果。

### 命令列模式（非互动式）

```doscon
C:\>units "ten furlongs per fortnight" "kilometers per hour"
        * 0.0059871429
        / 167.02458
```

```console
% units cup ounces
conformability error
        0.00023658824 m^3
        0.028349523 kg
```

### 复杂单位表达式

达西-魏斯巴赫方程式（Darcy–Weisbach equation）是流体力学中的方程式之一：

$$\Delta P = \frac {8} {\pi^2} \rho fL \frac {Q^2} {d^5} \,,$$

其中 ΔP 是压力降，ρ 是质量密度，f 是（无因次）摩擦系数，L 为管长，Q 为体积流率，d 为管径。若希望将方程式整理为方便使用美制单位的形式：

$$\Delta P = A_1 \,\rho fL \frac {Q^2} {d^5}$$

我们可以透过 units 快速计算出常数 A1：

```console
$ units "(8/pi^2)(lbm/ft^3)ft(ft^3/s)^2(1/in^5)" psi
        * 43.533969
        / 0.022970568
```

Crane 技术文件 No. 410 指出，该乘法系数约为 43.5。

## 参见

- 计量单位统一代码（Unified Code for Units of Measure）

## 外部链接

- Linux man page for units
- Java version of GNU units
- GnuWin port of GNU units
- Online units converter based on GNU units
- A simple online converter based on GNU units
- UDUNITS

## 基本资料

- 头衔：Units
- 开发者：GNU计划
- 软件版本周期：2.26
- 预览版本：2.26
- 编程语言：C语言
- 操作系统：Linux、FreeBSD、NetBSD、OpenBSD、大多数 Unix 实作、Windows
- 平台：随部分 Linux 发行版提供。另有两种 Windows 二进制发行版；其他平台仅提供源代码。
- 类型：工具程式
- 许可协议：2007年起：GPL-3.0-or-later、1997年起：GPL-2.0-or-later