JavaScriptのMath.cbrt():体積から立方体の辺の長さを求める
Math.cbrt()で立方根を計算し、体積から立方体の辺の長さを求める方法を解説。引数・戻り値、ブラウザーとNode.jsの実行手順、負数の扱い、入力検証と計算精度の制約を学べます。
何を解決するAPIなのか
立方体の体積は、辺の長さを3回掛けると求められます。反対に、体積から辺の長さを求めるには立方根を使います。たとえば体積が64立方センチメートルなら、辺は4センチメートルです。
Math.cbrt()は、この立方根を計算するJavaScriptの標準APIです。名前のcbrtはcube rootに由来します。寸法の計算や、体積に比例して3Dモデルを拡大する処理で役立ちます。
立方根は負数にも定義できます。-2を3回掛けると-8になるため、Math.cbrt(-8)は-2です。ただし、数学的に計算できることと、業務上受け入れてよい入力であることは別です。体積として使うなら、負数を拒否する検証も必要になります。
この記事では、APIの基本を確認してから、体積の入力を検証する小さな関数を作ります。立方根を返す仕様と基本例はMDNのMath.cbrt()で確認できます。
動作環境と対応状況
2026年10月13日時点で確認したMDNでは、Math.cbrt()は広く利用可能な機能で、2015年7月以降、主要ブラウザーを横断して使えるとされています。現在のChrome、Edge、Firefox、Safariで利用できます。古いブラウザーや組み込みWebViewでは、実行前に機能の有無を確認してください。
ブラウザー専用APIではないため、Node.jsでも利用できます。本記事のサンプルはNode.js 22または24を動作対象とし、追加パッケージや実験的な起動フラグは必要ありません。ここで示すバージョンは記事の対象環境であり、APIが初めて導入された最小バージョンではありません。
Node.jsはV8でJavaScriptを実行し、安定した言語機能を通常の実行で利用できます。背景はNode.jsのECMAScript対応解説を参照してください。
APIの存在は、次の式で確認できます。
console.log(typeof Math.cbrt === "function");対応環境での期待出力はtrueです。falseなら、本記事のコードをそのまま実行できません。ビルドで文法を変換するだけでは、存在しない標準APIは追加されない点にも注意してください。
引数と戻り値を理解する
呼び出し方
構文はMath.cbrt(x)です。引数xには立方根を求めたい数値を渡し、戻り値としてnumber型の計算結果を受け取ります。入力を書き換えることはありません。
Mathはコンストラクターではないため、インスタンスを作る必要はありません。常にMath.cbrt()という形で呼び出します。戻り値はPromiseではなく、同期的に得られる数値です。awaitやコールバックは不要です。
通常の数値と特殊な値
次のコードは単独で実行できます。
(() => {
console.log(Math.cbrt(64));
console.log(Math.cbrt(-8));
console.log(Math.cbrt(0));
console.log(Math.cbrt(Infinity));
console.log(Math.cbrt(-Infinity));
console.log(Number.isNaN(Math.cbrt(NaN)));
})();期待出力は次のとおりです。
4
-2
0
Infinity
-Infinity
trueNaNを渡しても例外は発生せず、結果がNaNになります。無限大も自動的には拒否されません。計算結果を画面に表示するだけでは、入力の異常を見逃す可能性があります。
また、Mathの計算はNumberを対象とします。BigIntを直接渡す用途には対応しません。型の制約はMDNのMathでも説明されています。
自己完結した実例:体積から辺を求める
次のコードをcube-edge.jsとして保存するか、ブラウザーの開発者ツールで実行してください。外部ライブラリーや通信は使いません。
(() => {
"use strict";
if (typeof Math.cbrt !== "function") {
console.log("この環境はMath.cbrt()に対応していません");
return;
}
function edgeFromVolume(volume) {
if (typeof volume !== "number" || !Number.isFinite(volume)) {
throw new TypeError("体積には有限の数値を指定してください");
}
if (volume < 0) {
throw new RangeError("体積は0以上にしてください");
}
return Math.cbrt(volume);
}
const volumes = [0, 8, 64, 125];
for (const volume of volumes) {
const edge = edgeFromVolume(volume);
console.log(`${volume} cm³ -> ${edge.toFixed(2)} cm`);
}
const invalidVolumes = [-8, "64", Infinity, NaN];
for (const volume of invalidVolumes) {
try {
edgeFromVolume(volume);
} catch (error) {
if (error instanceof Error) {
console.log(`${String(volume)} -> ${error.name}: ${error.message}`);
} else {
throw error;
}
}
}
})();期待出力は次のとおりです。これは仕様とコードを照合した期待値であり、実機での実行結果ではありません。
0 cm³ -> 0.00 cm
8 cm³ -> 2.00 cm
64 cm³ -> 4.00 cm
125 cm³ -> 5.00 cm
-8 -> RangeError: 体積は0以上にしてください
64 -> TypeError: 体積には有限の数値を指定してください
Infinity -> TypeError: 体積には有限の数値を指定してください
NaN -> TypeError: 体積には有限の数値を指定してくださいedgeFromVolume()は、有限の数値かどうかと、体積として許される範囲かどうかを順番に検証します。文字列の"64"は、数字に見えても受け入れません。期待出力ではString()で表示するため、引用符のない64として現れます。
toFixed(2)は表示用に小数点以下2桁へ整形する処理です。戻り値は文字列になるため、続けて計算する場合は、整形前のedgeを使ってください。
ブラウザーとNode.jsでの実行方法
ブラウザーで実行する
通常のWebページを開き、開発者ツールのConsoleを表示します。実例のJavaScriptコードを全体ごと貼り付けて実行すると、Consoleに期待出力が表示されます。DOMを操作しないため、専用のHTMLは不要です。
貼り付けに確認操作が必要なブラウザーでは、ブラウザーの案内に従ってください。コード全体を関数で囲んでいるので、繰り返し実行してもサンプル内部の変数名がConsoleのトップレベルで衝突しにくい構成です。
Node.jsで実行する
Node.js 22または24をインストールした環境で、実例をUTF-8のcube-edge.jsに保存します。ターミナルで保存先のフォルダーへ移動し、次のコマンドを実行します。
node --version
node cube-edge.js最初のコマンドでバージョンを確認し、2つ目でファイルを実行します。出力先はターミナルです。npm installやWebサーバーの起動は必要ありません。ファイル名をnodeへ渡す手順はNode.jsの公式実行ガイドに記載されています。
失敗例と計算上の制約
分数の累乗で置き換えると負数で失敗する
立方根を求めるつもりで、次のように分数の累乗を使うと、負数で結果が変わります。
(() => {
console.log(Math.pow(-8, 1 / 3));
console.log(Math.cbrt(-8));
})();期待出力は次のとおりです。
NaN
-2負の底に整数でない指数を指定した場合、Math.pow()はNaNを返します。立方根が目的なら、意図をそのまま表すMath.cbrt()を使うと、この違いを避けられます。比較対象の仕様はMDNのMath.pow()で確認できます。
入力の単位は自動変換されない
Math.cbrt()は単位を知りません。立方センチメートルで入力すれば辺はセンチメートルですが、リットルの数値をそのまま渡してもセンチメートルにはなりません。たとえば8リットルは8000立方センチメートルへ変換してから計算します。
フォーム入力を扱う場合も、空欄チェック、数値への変換、単位の統一を済ませてからedgeFromVolume()へ渡す設計にすると、責任の境界が明確になります。
小数の結果を厳密な値と考えない
Math.cbrt(2)のような計算は近似値になります。JavaScriptのNumberは64ビットの浮動小数点形式で、表現できる精度に限界があります。また、数学関数の精度には実装に依存する部分があります。MDNのNumberとMDNのMathを参照してください。
そのため、結果を3回掛け直した値と元の入力を、常に===で一致判定する設計は避けましょう。測定値なら許容誤差を決め、画面表示なら必要な桁数へ整形します。寸法の合否判定では、表示上の丸めと判定用の計算を分けることが実務上の改善点です。
活用事例と次の実装
- 立方体を仮定した容器や教材で、体積から辺の長さを表示する。
- 同じ形の3Dモデルで、体積比の立方根から各軸の拡大率を決める。
- 数学学習用ツールで、正数と負数の立方根を比較する。
たとえば同じ形の模型の体積を8倍にする場合、各方向の長さはMath.cbrt(8)の2倍にします。長さを8倍にすると体積は512倍になるため、体積比と長さの倍率を区別する必要があります。
実際の容器が直方体や複雑な形なら、体積だけから辺の長さを一意には決められません。まず形状の前提と単位を決め、その後に入力検証と表示を追加してください。最初の拡張としては、入力欄の横に単位とエラーメッセージを表示する方法が再現しやすいでしょう。
公式参考資料
Googleの優先するニュース提供元にSEの部屋を追加
Googleで、いつも読みたい情報源を選べます。登録可否はGoogleの画面で確認できます。
候補にSEの部屋が表示されない場合は、まだ追加できません。