「スプレッドシートで複素数を2乗したら、2i のはずが 1.22464679914735E-16+2i と出てきた…」。交流回路や数学の課題で複素数を扱っていると、こんな見慣れない値に手が止まることがありますよね。
負の数の平方根を出そうとして、POWER関数でエラーになった人もいるかもしれません。1/3乗で立方根を求めたのに、思っていた答えと違う値が返ってくることもあります。
GoogleスプレッドシートのIMPOWER関数なら、複素数と指数を渡すだけでべき乗を1つのセルに返してくれます。この記事では、構文と結果の早見表から誤差の消し方・エラーの直し方までをまとめました。
スプレッドシートのIMPOWER関数とは?書き方(構文と引数)と結果の早見表
IMPOWER関数は、複素数の底を指数でべき乗した結果を文字列で返すGoogleスプレッドシートの関数です。読み方は「アイエム・パワー」。imaginary(虚数)と power(べき乗)を組み合わせた名前ですね。
エンジニアリング関数(工学系の計算で使う関数群)のひとつです。2乗・3乗だけでなく、平方根や逆数も1つの式で求められます。
IMPOWER関数の構文と引数
=IMPOWER(複素数の底, 指数)
引数は2つで、どちらも省略できません。
| 引数 | 内容 | 例 |
|---|---|---|
| 複素数の底 | べき乗される複素数。「a+bi」または「a+bj」の形 | “3+4i”、A2、COMPLEX(3,4) |
| 指数 | 底を何乗するかを表す数値。小数・負の数も指定できる | 2、0.5、-1、1/3 |
虚数単位は小文字の i と j のどちらでも書けます。数学では i、電気・電子の分野では j を使うのが一般的です。
Googleの公式ヘルプでは、複素数のべき乗は極形式で定義されると説明されています。大きさ(絶対値)r と角度(偏角)θ を使うと、次の式になります。
(a+bi)^n = r^n × (cos(nθ) + i sin(nθ))
r = √(a² + b²)、θ = 複素数の偏角
「大きさは n 乗、角度は n 倍」と覚えておけば十分でしょう。この角度を使った計算が、後で紹介する「E-16」の誤差の原因にもなっています。
よく使う指数の結果早見表(2乗・3乗・平方根・立方根・逆数・0乗)
底を 3+4i にして、よく使う指数の結果を並べました。
| 目的 | 数式 | 結果 |
|---|---|---|
| 2乗 | =IMPOWER(“3+4i”, 2) | -7+24i |
| 3乗 | =IMPOWER(“3+4i”, 3) | -117+44i |
| 平方根(0.5乗) | =IMPOWER(“3+4i”, 0.5) | 2+i |
| 立方根(1/3乗) | =IMPOWER(“3+4i”, 1/3) | 約 1.6289+0.5202i |
| 逆数(-1乗) | =IMPOWER(“3+4i”, -1) | 0.12-0.16i |
| 0乗 | =IMPOWER(“3+4i”, 0) | 1 |
この6式は、実際のセルでも右の列と同じ表示になります(立方根は 1.62893714592218+0.520174502304546i のように小数15桁ほどで表示)。虚部が 1 のときは「2+i」のように係数の 1 が省略されます。
一方、1+1i の2乗のように角度がちょうど π/2 になる計算では、整数になるはずの部分に小さな誤差が付くことがあります。詳しくは後の章で解説します。
平方根と立方根は、いくつかある解のうち1つ(主値)だけが返る点も覚えておきたいところ。
IMPOWER関数の基本の使い方
ここからは、指数の種類ごとに書き方と結果を確認していきます。サンプルの値は、手計算でも追える簡単なものを選びました。
2乗・3乗を求める
指数に整数を渡すと、その回数だけ掛け合わせた値が返ります。
=IMPOWER("2+3i", 2) → -5+12i
=IMPOWER("1+2i", 3) → -11-2i
=IMPOWER("5+2i", 3) → 65+142i
1行目を手計算すると、(2+3i)² = 4+12i+9i² = -5+12i です。3行目は公式ヘルプに載っている例で、結果は 65+142i と紹介されています。
この3つは実機でも誤差なしで表示されます。ただし、結果が純虚数や実数になる計算(たとえば 1+1i の2乗)では小さな端数が付くことがあります。端数の消し方は次の章で紹介するので、まずは書き方だけ押さえておきましょう。
0.5乗・1/3乗で平方根・立方根を求める(返るのは解の1つだけ)
指数を 0.5 にすると平方根、1/3 にすると立方根になります。
=IMPOWER("3+4i", 0.5) → 2+i
=IMPOWER("8", 1/3) → 2
=IMPOWER("-8", 1/3) → 約 1+1.73205080756888i
注意したいのは、0 以外の複素数には立方根が3つあるのに、返るのは1つだけという点です。たとえば 8 の立方根は 2 と -1±1.732i の3つ。IMPOWERが返すのは「主値」と呼ばれる 2 です。
-8 の結果は、もっと意外に感じるかもしれません。実数の答え -2 ではなく、主値の 1+1.732…i が返ります。
主値とは、偏角を -π より大きく π 以下の範囲で取って計算した値のことです。残り2つの解は、主値の角度に 2π/3 ずつ足すと求められます。角度の確認には、IMARGUMENT関数を使ってみてください。
平方根だけが目的なら、IMSQRT関数でも同じ主値が得られます。=IMSQRT(“3+4i”) と =IMPOWER(“3+4i”, 0.5) は、数学的には同じ値で、実機でもどちらも 2+i と表示されます。
負の指数で逆数を求める
指数に -1 を渡すと、複素数の逆数になります。
=IMPOWER("3+4i", -1) → 0.12-0.16i
=IMPOWER("-1-j", -1) → -0.5+0.5j
1/(3+4i) は (3-4i)/25 なので、手計算どおりの値ですね。2行目は公式ヘルプの例で、j で書いた底の結果も -0.5+0.5j と j で示されています。
指数 -2 なら 1/z²、-0.5 なら 1/√z という具合に、負の指数は「逆数の○乗」として使えます。割り算の関数を使わずに済むので、式が短くなるのがうれしいところ。
セル参照とCOMPLEX関数で複素数を渡す
実務では、セルに入った複素数を使うことが多いはずです。次のような表なら、C2 に式を入れて C5 までコピーします。
| 行 | A(底) | B(指数) | C(結果) |
|---|---|---|---|
| 2 | 2+3i | 2 | -5+12i |
| 3 | 1+2i | 3 | -11-2i |
| 4 | 3+4i | -1 | 0.12-0.16i |
| 5 | -4 | 0.5 | 1.22464679914735E-16+2i |
=IMPOWER(A2, B2)
実機でも C2〜C4 は表のとおりに表示されます。C5 だけは、数学上は 2i のところ、実部に E-16 の誤差が付いて表のように表示されます。
実部と虚部が別の列に分かれているなら、COMPLEX関数で複素数を組み立ててから渡しましょう。
=IMPOWER(COMPLEX(2, 3), 2) → -5+12i
=IMPOWER(COMPLEX(10, 20, "j"), 2) → -300+400j
COMPLEX の第3引数に “j” を指定すると、j の複素数を作れます。電気系のシートで表記を j にそろえたいときに便利ですね。j の底を渡すと、結果も j で返ります。
ARRAYFORMULAで列をまとめて計算する
A2:A5 に 1+1i、2+3i、3+4i、1+2i が並んでいるとします。ARRAYFORMULA と組み合わせれば、1つの式で4行分の2乗を出せます。
=ARRAYFORMULA(IMPOWER(A2:A5, 2))
結果は上から 1.22464679914735E-16+2i、-5+12i、-7+24i、-3+4i の順に展開されます。1行目の 1+1i は、数学上は 2i ですが、次の章で扱う誤差が付いて表示されます。
途中に空白行がある範囲なら、IF で空白を飛ばしておくと安心です。
=ARRAYFORMULA(IF(A2:A10="", "", IMPOWER(A2:A10, 2)))
結果に「E-16」が出るのはなぜ?微小誤差の消し方
IMPOWERを使っていて一番戸惑うのが、この「E-16」ではないでしょうか。
整数乗でも誤差が出る理由
=IMPOWER(“1+1i”, 2) の答えは、数学的には 2i です。ところがセルには、1.22464679914735E-16+2i のような値が表示されます。
E-16 は「×10のマイナス16乗」を表す指数表記。つまり実部は 0.000000000000000122… という、ほぼ 0 の値です。
原因は、角度を使う極形式で計算していることにあると考えられます。1+1i の角度は π/4 なので、2乗すると角度は π/2 になります。cos(π/2) は本来 0 のはず。
ところがコンピューターの小数(倍精度浮動小数点数)では、π を正確に表せません。そのため cos(π/2) が約 6.12×10⁻¹⁷ になり、大きさの 2 を掛けた約 1.22×10⁻¹⁶ が実部に残ります。
この誤差は計算の仕組みから出るもので、数式の間違いではありません。純虚数や実数になるはずの結果(角度が π/2 や π)で目にしやすいでしょう。
ROUNDとCOMPLEXで誤差を消す数式
実部と虚部を取り出して丸め、もう一度複素数に組み立て直すのが基本です。B2 に IMPOWER の結果がある場合は、次の式を使います。
=COMPLEX(ROUND(IMREAL(B2), 10), ROUND(IMAGINARY(B2), 10))
IMREAL関数で実部を、IMAGINARY関数で虚部を取り出します。それぞれを ROUND で小数点以下10桁に丸め、COMPLEX で「a+bi」の形に戻す流れです。
B2 が 1.22464679914735E-16+2i なら実部は 0、虚部は 2 に丸まり、2i に戻る計算ですね。実機でも IMREAL・IMAGINARY は E 表記入りの文字列を読め、結果は 2i になります。
1つのセルで済ませたいなら、IMPOWER をそのまま入れ子にします。
=COMPLEX(ROUND(IMREAL(IMPOWER(A2, 2)), 10), ROUND(IMAGINARY(IMPOWER(A2, 2)), 10))
j で返したいときは、COMPLEX の第3引数に “j” を足してください。丸める桁は10桁が目安です。結果の値が大きいほど誤差も大きくなるので、桁数を少し減らすと確実でしょう。
IMPRODUCTで掛け合わせた場合との比較
整数乗なら、IMPRODUCT関数で同じ複素数を掛け合わせる方法もあります。
=IMPOWER("1+1i", 2) → 2i(誤差が付くことがある)
=IMPRODUCT("1+1i", "1+1i") → 2i
=IMPRODUCT("1+1i", "1+1i", "1+1i") → -2+2i
IMPRODUCT の掛け算は、実部と虚部の足し引きだけで済む計算です。角度を経由しないので、実機でも誤差のない 2i が返ります。
| 方法 | 整数乗 | 小数・負の指数 | 式の長さ |
|---|---|---|---|
| IMPOWER | ○(誤差が付くことがある) | ○ | 指数が大きくても短い |
| IMPRODUCT | ○ | ×(掛け算のみ) | 指数の数だけ引数が増える |
| IMPOWER+ROUND/COMPLEX | ○(誤差を消せる) | ○ | 長くなる |
2〜3乗で誤差が気になるなら IMPRODUCT、それ以外は IMPOWER+丸め。この使い分けが現実的です。
表示形式では消えない理由(戻り値は文字列)
E-16 を消そうとして、表示形式で小数点以下の桁数を減らした人もいるかもしれません。ところが IMPOWER の戻り値は、数値ではなく文字列です。
表示形式は文字列には効かないため、見た目は変わりません。誤差を消すには、前の数式のように中身の値そのものを丸める必要があります。
0 かどうかを判定したいだけなら、しきい値で比べる方法も使えます。=ABS(IMREAL(B2))<1E-10 なら、実部がほぼ 0 のときに TRUE が返る仕組みです。
IMPOWER関数の実務での使い方
基本がわかったところで、実務や課題で役立つ使い方を3つ紹介します。どれも POWER関数や手計算では手間がかかる場面ばかり。
負の数の平方根・累乗根を求める(POWER関数との比較)
実数のべき乗を計算するPOWER関数は、負の数の小数乗を苦手とします。負の数の平方根は、実数の範囲に存在しないためです。
| 数式 | 結果 | ポイント |
|---|---|---|
| =POWER(-4, 0.5) | #NUM! | 実数の平方根は存在しない |
| =IMPOWER(“-4”, 0.5) | 1.22464679914735E-16+2i | 複素数として計算できる(実部は E-16 の誤差) |
| =POWER(-8, 3) | -512 | 整数乗なら POWER で問題ない |
| =IMPOWER(“-8”, 1/3) | 約 1+1.732i | 主値なので -2 にはならない |
二次方程式の判別式が負になったときなど、虚数の答えが欲しい場面では IMPOWER を使いましょう。IMPOWER(“-4”, 0.5) の実部には、前の章の E-16 が付きます。きれいな 2i にしたいときは、前の章の ROUND+COMPLEX を使ってください。
逆に「-8 の立方根として -2 が欲しい」なら、IMPOWERではなく実数の式で求めます。
=SIGN(A2) * POWER(ABS(A2), 1/3) → A2 が -8 なら -2
符号を外して立方根を求め、最後に符号を戻す書き方です。3乗根や5乗根のような奇数乗根で使えます。
ド・モアブルの定理で結果を検算する(IMABS・IMARGUMENT)
複素数を n 乗すると、大きさは n 乗、角度は n 倍になります。これがド・モアブルの定理ですね。IMABS関数とIMARGUMENT関数を使えば、IMPOWERの結果をシート上で検算できます。
A2 に 2+3i、B2 に指数 2 が入っているとします。
| セル | 数式 | 結果(約) | 意味 |
|---|---|---|---|
| C2 | =IMABS(A2)^B2 | 13 | 元の大きさの n 乗 |
| D2 | =IMABS(IMPOWER(A2, B2)) | 13 | 結果の大きさ |
| E2 | =IMARGUMENT(A2)*B2 | 1.9656 | 元の角度の n 倍 |
| F2 | =IMARGUMENT(IMPOWER(A2, B2)) | 1.9656 | 結果の角度 |
C2 と D2、E2 と F2 がそれぞれ一致すれば計算どおりです。誤差を考えて、一致の判定はしきい値で行いましょう。
=AND(ABS(D2-C2)<1E-9, ABS(F2-E2)<1E-9) → TRUE
1つ注意したいのは、角度が -π〜π の範囲に折り返される点です。2+3i を4乗すると、角度は 0.9828×4 ≈ 3.931 で π を超えます。
このとき IMARGUMENT は 3.931-2π ≈ -2.352 を返します。E列とF列の差がちょうど 2π なら、計算は正常です。
インピーダンスの逆数(アドミタンス)を求める
交流回路では、インピーダンス Z の逆数 1/Z をアドミタンスと呼びます。並列回路の合成は、アドミタンスを足してから逆数に戻すのが定番。指数 -1 の IMPOWER がそのまま使えます。
| セル | 内容 | 入力・数式 | 結果 |
|---|---|---|---|
| A2 | Z1(抵抗3Ω+コイル4Ω) | 3+4j | ― |
| A3 | Z2(抵抗3Ω+コンデンサ4Ω) | 3-4j | ― |
| B2 | Y1 = 1/Z1 | =IMPOWER(A2, -1) | 0.12-0.16j |
| B3 | Y2 = 1/Z2 | =IMPOWER(A3, -1) | 0.12+0.16j |
| B4 | 合成インピーダンス | =IMPOWER(IMSUM(B2, B3), -1) | 4.16666666666667 |
アドミタンスの合計は 0.24 で、その逆数の約 4.1667Ω が合成インピーダンスです。コイルとコンデンサの虚部が打ち消し合い、抵抗だけ(実数)になる例ですね。実機でも B2・B3 は j のまま返り、B4 に虚部は残りません。
IMPOWER関数のエラーと注意点(#NUM!・#VALUE!・#N/A)
IMPOWERのエラーは、原因ごとに種類が決まっています。まずは全体像を表で確認しましょう。
| エラー | 主な原因 | 例 |
|---|---|---|
| #NUM! | 底の書き方の誤り | “1+1I”、”1+1i” |
| #VALUE! | 指数が数値に変換できない | 指数に “a” |
| #N/A | 引数が #N/A・引数の数の誤り | =IMPOWER(“1+1i”) |
#NUM!:複素数の書き方の誤り
底が複素数として読めないと #NUM! になります。
=IMPOWER("1+1I", 2) → #NUM!(大文字の I)
=IMPOWER("1+1k", 2) → #NUM!(i・j 以外の文字)
=IMPOWER("1+1i", 2) → #NUM!(全角の数字)
=IMPOWER("3 + 4i", 2) → #NUM!(全角の空白)
=IMPOWER("1 + 1i", 2) → "1+1i" と同じ結果(半角の空白は問題なし)
半角の空白は無視されますが、全角の空白はエラーの原因になります。他のファイルから貼り付けた複素数は、全角が混じっていないか確かめてください。
底が 0 のときも注意が必要です。0 の負の数乗は 0 で割る計算になり、0 の 0 乗は定義が分かれます。実機では、IMPOWER(“0”, -1) も IMPOWER(“0”, 0) も #NUM! になります。
底のセルが空白のときはエラーにならず、0 として扱われて結果が 0 になります。気づきにくいので、IF で空白を除外しておくと安全です。
#VALUE!:指数に数値以外を渡した
指数に数値に変換できない文字列を渡すと、#VALUE! になります。
=IMPOWER("1+1i", "a") → #VALUE!
=IMPOWER("1+1i", "2") → 2乗として計算される
=IMPOWER("1+1i", TRUE) → 1+i(TRUE は 1 として計算)
“2” のような数字だけの文字列は、数値に読み替えられて計算されます。論理値の TRUE も 1 扱い。ほかのIM系関数では論理値が #NUM! になるので、IMPOWERの指数は例外といえます。
#N/A:エラー値・引数の数の誤り
参照先のセルが #N/A のときは、結果も #N/A がそのまま返ります。=IMPOWER(“1+1i”) のように指数を書き忘れたときも #N/A です(引数を3つ書いた場合も #N/A)。
IFERROR で包めばエラー表示は消せますが、原因まで隠れてしまいます。先に原因を切り分けてから使いましょう。
戻り値は文字列なので四則演算はIM系関数で
IMPOWERの戻り値は文字列なので、そのまま + で足すと #VALUE! になります。
=IMPOWER("1+1i", 3) + 1 → #VALUE!
=IMSUM(IMPOWER("1+1i", 3), 1) → -1+2i
=IMREAL(IMPOWER("1+1i", 3)) + 1 → -1
複素数のまま計算を続けるなら IMSUM、実部だけを数値で使うなら IMREAL で取り出しましょう。
Excelとの違いと関連関数
Excelにも同じ名前のIMPOWER関数があり、底と指数の2つを渡す書き方は共通です。ただし、誤差の出方や表示の細部が同じとは限りません。ファイルをやり取りするときは、結果を一度確かめておくと安心です。
Excelでの使い方はExcelのIMPOWER関数の解説にまとめています。
IMPOWERと一緒に使うことが多い関数は次のとおりです。
| 関数 | できること |
|---|---|
| COMPLEX | 実部と虚部から複素数を作る |
| IMREAL / IMAGINARY | 実部・虚部を取り出す |
| IMABS / IMARGUMENT | 大きさ・角度を求める |
| IMPRODUCT | 複素数どうしを掛ける |
| IMSQRT | 平方根を求める |
| IMEXP / IMLN | 指数関数・自然対数を求める |
| POWER | 実数のべき乗を求める |
IMPOWERの指数に渡せるのは実数だけ。指数にも複素数を使いたいときは、z^w = e^(w×ln z) の関係を使い、IMEXP と IMLN を組み合わせます。
=IMEXP(IMPRODUCT(B2, IMLN(A2))) → A2 の B2 乗(A2・B2 とも複素数)
まとめ:スプレッドシートのIMPOWER関数のポイント
GoogleスプレッドシートのIMPOWER関数は、複素数のべき乗を1つの式で求められる関数です。最後にポイントを整理しておきます。
- 構文は =IMPOWER(複素数の底, 指数) で、戻り値は文字列
- 指数は 2・3 の整数のほか、0.5(平方根)・1/3(立方根)・-1(逆数)も使える
- 分数乗で返るのは解のうち1つ(主値)だけ。-8 の立方根は -2 にならない
- 整数乗でも E-16 のような微小な誤差が付くことがある
- 誤差は COMPLEX(ROUND(IMREAL(x),10), ROUND(IMAGINARY(x),10)) で消せる
- 表示形式では誤差は消えない(戻り値が文字列のため)
- POWER では計算できない負の数の平方根も求められる
- 大文字の I・全角文字・全角空白は #NUM!、指数の “a” は #VALUE!
- 計算を続けるときは IMSUM や IMREAL など、IM系関数で受け取る
E-16 の誤差さえ押さえておけば、IMPOWERは頼れる道具になります。まずは早見表の式をシートに貼って、結果を手元で確かめてみてください。
