PowerShellを電卓として使う際のTips集

Windows PowerShell

しばたです。
たまにはPowerShellで軽い感じの記事を書きたくなったので。

PowerShell as a 電卓

PowerShellに限らず他言語のREPLでも同様のことはできるのですが、(バージョンを問わなければ)ほぼ全てのWindowsに標準搭載されていることからPowerShellを電卓代わりに使う人は意外と多くいます。

実際私もほぼ常時PowerShellコンソールを起動しているので、ちょっとした計算であればPowerShellコンソール上でしてしまうことは多いです。

例えばこんな感じで、コンソール上で(1+2)*3/4の様な数式を入力しEnterを押してやると計算結果を出力してくれます。

(上図はPowerShell Coreで実行していますが、Windows PowerShellでも同様です)

本記事ではPowerShellコンソール上で数値計算させる際の基本といくつかのTipsを紹介します。

PowerShellを電卓として使う際のTips集

1. 基本的な演算子

PowerShellで使える算術演算子は以下となります。

演算子 用例 内容
+ 1 + 2 加算、プラス
- 1 - 2 減算、マイナス
* 1 * 2 乗算
/ 10 / 2 除算
% 10 % 3 余剰

演算の優先順位を明示する場合はかっこ()で括ってください。

C:\> 1 + (2 * 3) / 4
2.5

2. 暗黙の型

PowerShellで扱う数値は内部で型を持っており、型を明示しない場合は整数はint型 (System.Int32)またはlong型(System.Int64)(intの範囲を超える場合)、小数はdouble型 (System.Double)となります。

# 整数は int型(int32)
C:\> 123 | gm

   TypeName: System.Int32

・・・ 省略 ・・・

# intの範囲を超える整数は long型(int64)
C:\> 2147483648 | gm # [int]::MaxValue+1

   TypeName: System.Int64

・・・ 省略 ・・・

# 小数は double型
C:\> 123.45 | gm

   TypeName: System.Double

・・・ 省略 ・・・

他の数値型を使いたい場合はキャストするか接尾語を付けて型を明示してください。

# 接尾語 d は decimal型
C:\> 1.23d | gm

   TypeName: System.Decimal

・・・ 省略 ・・・

3. 丸め、0除算

PowerShellにおける暗黙的な丸めは.NET Frameworkのそれと同じで銀行丸め(偶数への最近接丸め)です。

# キャストなどによる暗黙の丸めは偶数への最近接丸め
C:\> [int]12.5
12

いわゆる "四捨五入" をしたい場合は[Math]::Roundメソッドを使ってやる必要があります。

C:\> [Math]::Round(12.5, [MidpointRounding]::AwayFromZero)
13

また0除算について、Double型以外に対する0除算は例外となるのですが、Double型に対する0除算は[Double]::PositiveInfinityまたは[Double]::NegativeInfinityを返すためコンソール上ではまたは-∞と表示されるので注意が必要です。

# 整数に対する0除算は例外
C:\> 123/0
Attempted to divide by zero.
At line:1 char:1
+ 123/0
+ ~~~~~
+ CategoryInfo          : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException

# double型に対する0除算は [Double]::PositiveInfinity か [Double]::NegativeInfinity を返す
C:\> 123.45/0
∞
C:\> -123.45/0
-∞

4. 数値計算クラス

前述の[Math]クラスを使って様々な数値計算をすることができます。

よく使われるのは累乗のPowメソッドでしょうか。

# PowerShellでは累乗を表す演算子はないため [Math]::Pow メソッドを使う
C:\> [Math]::Pow(2,10)
1024

5. 基数変換

PowerShellでは接頭語0xを付けることで16進数を表現できます。
16進数から10進数への変換はこんな感じですぐできます。

C:\> 0x1f
31

他の基数変換はConvertクラスやToString()メソッドで可能です。

# ToString()メソッドの書式指定で 10進数→16進数 変換
C:\> (31).ToString("x")
1f

# Convertクラスを使い 10進数→8進数 変換
C:\> [Convert]::ToString(31,8)
37

6. 多倍長整数、複素数など

.NET Framework 4.0を基盤とするPowerShell 3.0以降でのみ可能なTipsです。
.NET Framework 4.0からはSystem.Numerics名前空間多倍長整数型(BigIngeter)複素数型(Complex)が追加されており、PowerShellからも利用することが可能です。

このうちBigIngeter型については[bigint]型アクセラレーターが使えます。

# PowerShellで多倍長整数
C:\> [bigint]::Pow([long]::MaxValue, 3)
784637716923335095224261902710254454442933591094742482943

# PowerShellで複素数計算
C:\> $c1 = New-Object System.Numerics.Complex (1, 2)
C:\> $c2 = New-Object System.Numerics.Complex (3, 4)
C:\> $c1 + $c2

Real Imaginary        Magnitude             Phase
---- ---------        ---------             -----
   4         6 7.21110255092798 0.982793723247329

ちなみにですが、Numerics名前空間で使用可能な構造体は.NET Frameworkのバージョンにより若干異なるため環境によっては利用できない機能があるのでご注意ください。

Excel関数

こちらはちょっと異色なのですがVB.NETは独自の機能として幾つかExcel関数と同等の関数を持っています。
この機能をPowerShellから呼ぶことによって間接的にExcel関数と同等の計算をさせることが可能です。
詳しくは私が以前書いたブログをご覧ください。

Windows PowerShellとPowerShell CoreでVB.NET独自機能対する実装が異なるため、この方法を使えるのはWindows PowerShellだけとなります。

# 以下は Windows PowerShellでのみ可能 (PowerShell Coreでは不可)

# 定額法で減価償却費を求める
#   SLN(取得価額, 残存価額, 耐用年数)で指定
C:\> Add-Type -AssemblyName "Microsoft.VisualBasic"
C:\> [Microsoft.VisualBasic.Financial]::SLN(150000, 15000, 5)
27000

PoweShell関数

PowerShellはスクリプト言語です。
ここまでのTipsでできない計算があれば最悪関数を自作することもできます。
ただし、計算量が多い複雑なものはPowerShellで作らずC#などで関数を作り、PowerShellではAdd-Typeして呼び出す様にするのがお勧めです。

また、まっとうな使い方としては定期的に行う計算がある場合あらかじめ関数化しておくと普段の作業が捗ることでしょう。

最後に

ざっとこんな感じです。

PowerShellを電卓として使う、PowerShellで数値計算を行う際のTipsを思いつく限りまとめてみました。
この中のどれか一つでも皆さんの役に立てば幸いです。