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