JavaScript

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の存在は、次の式で確認できます。

JavaScript
console.log(typeof Math.cbrt === "function");

対応環境での期待出力はtrueです。falseなら、本記事のコードをそのまま実行できません。ビルドで文法を変換するだけでは、存在しない標準APIは追加されない点にも注意してください。

引数と戻り値を理解する

呼び出し方

構文はMath.cbrt(x)です。引数xには立方根を求めたい数値を渡し、戻り値としてnumber型の計算結果を受け取ります。入力を書き換えることはありません。

Mathはコンストラクターではないため、インスタンスを作る必要はありません。常にMath.cbrt()という形で呼び出します。戻り値はPromiseではなく、同期的に得られる数値です。awaitやコールバックは不要です。

通常の数値と特殊な値

次のコードは単独で実行できます。

JavaScript
(() => {
  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)));
})();

期待出力は次のとおりです。

CODE
4
-2
0
Infinity
-Infinity
true

NaNを渡しても例外は発生せず、結果がNaNになります。無限大も自動的には拒否されません。計算結果を画面に表示するだけでは、入力の異常を見逃す可能性があります。

また、Mathの計算はNumberを対象とします。BigIntを直接渡す用途には対応しません。型の制約はMDNのMathでも説明されています。

自己完結した実例:体積から辺を求める

次のコードをcube-edge.jsとして保存するか、ブラウザーの開発者ツールで実行してください。外部ライブラリーや通信は使いません。

JavaScript
(() => {
  "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;
      }
    }
  }
})();

期待出力は次のとおりです。これは仕様とコードを照合した期待値であり、実機での実行結果ではありません。

CODE
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に保存します。ターミナルで保存先のフォルダーへ移動し、次のコマンドを実行します。

Shell
node --version
node cube-edge.js

最初のコマンドでバージョンを確認し、2つ目でファイルを実行します。出力先はターミナルです。npm installやWebサーバーの起動は必要ありません。ファイル名をnodeへ渡す手順はNode.jsの公式実行ガイドに記載されています。

失敗例と計算上の制約

分数の累乗で置き換えると負数で失敗する

立方根を求めるつもりで、次のように分数の累乗を使うと、負数で結果が変わります。

JavaScript
(() => {
  console.log(Math.pow(-8, 1 / 3));
  console.log(Math.cbrt(-8));
})();

期待出力は次のとおりです。

CODE
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倍になるため、体積比と長さの倍率を区別する必要があります。

実際の容器が直方体や複雑な形なら、体積だけから辺の長さを一意には決められません。まず形状の前提と単位を決め、その後に入力検証と表示を追加してください。最初の拡張としては、入力欄の横に単位とエラーメッセージを表示する方法が再現しやすいでしょう。

公式参考資料

PREFERRED SOURCES

Googleの優先するニュース提供元にSEの部屋を追加

Googleで、いつも読みたい情報源を選べます。登録可否はGoogleの画面で確認できます。

Googleの設定画面で確認する 新しいタブで開きます

候補にSEの部屋が表示されない場合は、まだ追加できません。

y.
WRITTEN BY

y_ymo10

SEの部屋で、HTML・CSSからJavaScript・React・Next.jsまで、Web制作の開発ノートを公開しています。

ほかの開発ノートを読む →