コンテンツへスキップ

コードでのn乗根

Unicodeエスケープ、LaTeX、そしてJavaScript、Python、Excelをはじめとする十数個の言語での実際のx^(1/n)の数式まで — 奇数の指数と偶数の指数が負の数に対してまったく異なる挙動をする理由も含めて解説します。

または今すぐ正確な記号を生成する →

Unicodeエスケープ & HTMLエンティティ

4乗根の∜はUnicodeコードポイントU+221Cで、他のエスケープと同じように文字列リテラルに組み込めます。それ以外の指数はすべて、 上付き数字とU+221A(根号本体)という2つのエスケープを組み合わせて作る必要があります。

JavaScript / TypeScript(4乗根)
"\u221C" // ∜
Python(4乗根)
"\u221c"  # ∜
JavaScript / TypeScript(5乗根、組み合わせ)
"\u2075\u221A" // ⁵√
HTML(4乗根)
∜ (名前付きエンティティなし)
CSS(4乗根)
content: "\221C";

LaTeX

\sqrtは、LaTeX、MathJax、KaTeXで引数の上にバーがついた正しい根号を表示します — 角括弧内の値が指数を決めます。 具体的な数字でも、文字nでも構いません。

LaTeX — n乗根(変数の指数)
\sqrt[n]{x}
LaTeX — 5乗根
\sqrt[5]{x}
LaTeX — 立方根(比較用)
\sqrt[3]{x}

コードでn乗根を計算する

平方根や立方根と違い、主流の言語で専用の「n乗根」関数を用意しているものはありません — ここに挙げたものはすべて、 xを1/n乗として計算しています。32の5乗根を例に、各言語での書き方を紹介します。

JavaScript
Math.pow(32, 1 / 5);
// 2
Math.pow(-243, 1 / 5);
// NaN — 実際の答えは-3だが、下の注意点を参照
Python
32 ** (1/5)
# 2.0
(-243) ** (1/5)
# 複素数になる!下の注意点を参照
Excel / Google Sheets
=A1^(1/B1)
=SIGN(A1)*ABS(A1)^(1/B1)  // A1が負の数でB1が奇数でも安全
Java
Math.pow(32, 1.0 / 5);
// 2.0
C / C++
#include <math.h>
pow(32, 1.0 / 5);
// 2
PHP
pow(32, 1 / 5);
// 2
PostgreSQL
SELECT POWER(32, 1.0/5);
-- 2
Swift
import Foundation
pow(32.0, 1.0 / 5.0)
// 2.0
R
32 ^ (1/5)
# 2

知っておくべき注意点

奇数か偶数かで、負の数に実数の答えがあるかどうかが変わる

-243の5乗根は実数で-3です。これは負の数の立方根が成り立つのと同じく、奇数の指数であれば常に成り立ちます。一方、-16の4乗根はまったく実数になりません。これは負の数の平方根が実数にならないのと同じく、偶数の指数では常にこうなります。x^(1/n)が負のxに対して意味を持つかどうかは、特定の言語がどう実装しているかを見る前に、nが奇数か偶数かだけで決まります。

汎用の累乗関数は、実数の答えが存在する場合でも負の底を誤って扱う

Math.pow(-243, 1/5)は、数学的に正しい答えが-3であるにもかかわらず、JavaScriptではNaNを返します — Math.pow()は分数の指数を対数を使って計算するため、負の底に対しては定義できず、奇数の指数と偶数の指数を区別できないのです。Pythonの(-243) ** (1/5)も同じ理由で、-3ではなく複素数を返します。どちらの言語にも、立方根専用のMath.cbrt()のような専用の「n乗根」関数はありません — nが奇数かどうかを確認するヘルパー関数を自分で書くか、非負の入力に限定するかのどちらかです。

安全なn乗根のヘルパー関数は、符号と奇偶で分岐させる必要がある

信頼できるバージョンは次のようになります: xが負の場合、nが奇数のときに限り実数の結果を計算し、その場合はxの絶対値のn乗根を求めてから元の負の符号を再適用します — JavaScriptならMath.sign(x) * Math.abs(x) ** (1/n)、Pythonならmath.copysign(abs(x) ** (1/n), x)です。負のxで偶数のnの場合、返すべき実数の結果はそもそも存在しません — コードがエラーを投げるべきか、NaNを返すべきか、複素数を返すべきかを事前に決めておいてください。

ExcelとGoogle SheetsにはNTHROOT関数がない

どちらのアプリにも専用の数式はありません。=A1^(1/B1)は、結果が実数かつ非負の入力になる場合はいつでも使えますが、負のA1と特定のB1の組み合わせでは#NUM!エラーを返します。=SIGN(A1)*ABS(A1)^(1/B1)はB1が奇数の場合を解決しますが、B1が偶数でA1が負の場合は、そもそも実数の結果が存在しないため、これでも実数の結果は得られません。

浮動小数点の精度は、指数が大きくなるほど誤差が蓄積する

32 ** (1/5)は、言語によっては正確な2ではなく1.9999999999999998になることがあります。1/n自体が不正確な二進小数になりやすいため、指数が大きくなるほどこの誤差は広がる傾向があります。n乗根の結果を厳密な等価性で比較する前には四捨五入してください — 平方根にも当てはまる注意点ですが、n乗根ではやや顕著になります。

記号そのものだけが必要ですか?

コピー形式のページには、専用の4乗根の文字、組み合わせて作る上位の指数の記号、表計算ソフトの数式まで、すぐに貼り付けられる形式が 揃っています — コードエディタは不要です。

コピー形式を開く

よくある質問

コード内でn乗根の記号を表すUnicodeエスケープは何ですか?

4乗根に限っては、\u221C(JavaScript、Java、C#)または\u221c(Python)を使います — どちらも∜になります。それ以外の指数では、上付き数字のエスケープと\u221A(根号本体)を連結します。例えばJavaScriptで\u2075\u221Aは⁵√になります。

JavaScriptでn乗根を計算するにはどうすればいいですか?

Math.pow(x, 1 / n)を使います — 例えばMath.pow(32, 1/5)は2を返します。これは非負のxに対してはうまく機能します。負のxで奇数のnの場合、実数の答えが存在するにもかかわらずMath.pow()は誤ってNaNを返します。まず符号とnの奇偶を確認するヘルパー関数が必要です(下の注意点を参照)。

Pythonでn乗根を計算するにはどうすればいいですか?

非負の数であれば、x ** (1/n)もmath.pow(x, 1/n)もどちらも機能します。例えば32 ** (1/5)は2.0を返します。負のxの場合、x ** (1/n)は、nが奇数で実数の答えが存在する場合でも、実数ではなく複素数を返します — この場合に実数の結果を得るにはmath.copysign(abs(x) ** (1/n), x)を使ってください。

ExcelやGoogle Sheetsでn乗根を求める数式は何ですか?

どちらのアプリにも組み込みのNTHROOT関数はありません。=A1^(1/B1)を使ってください。B1に指数を入れます。A1が負の数になり得てB1が奇数の場合は、単純な累乗の数式は負の底に対してエラーになるため、代わりに=SIGN(A1)*ABS(A1)^(1/B1)を使ってください。

n乗根のLaTeXコマンドは何ですか?

変数の指数なら\sqrt[n]{x}、具体的な指数なら数字に置き換えてください — 5乗根なら\sqrt[5]{x}、12乗根なら\sqrt[12]{x}です。角括弧の引数を丸ごと外した\sqrt{x}は単純な平方根になります。LaTeX、MathJax、KaTeXで使用できます。

なぜMath.pow(-243, 1/5)は-3ではなくNaNを返すのですか?

Math.pow()(および多くのC系言語の同等の関数)は対数を使って分数の指数を計算しますが、対数は指数が奇数か偶数かにかかわらず負の底に対して定義されていません — そのため、負の数の奇数指数根が定義可能な実数値であることを認識せず、一律にNaNを返してしまいます。Math.cbrt()のような専用の立方根関数は、その1つの特定のよく使われる指数のために別々に実装されているため正しく計算できますが、任意のn乗根に対応する組み込み関数は存在しません。