互換性をどこまで詰めているか
Formulon は、丸めの残差、文字列からの型変換、エラーの優先順位、配列の形状まで、Excel の実測結果に合わせています。次の編集や保存に影響する、保存済み数式の表記やワークブックの挙動も対象です。比較の基準は、プロファイルとビルドを特定した Excel の取得値です。
このページでは、代表例と、より広い実装範囲を支える回帰テストを示します。Excel の挙動をすべて列挙したページではありません。ローカルで実行できる関数は数式カバレッジ、結果の比較方法は Oracle テストで説明しています。
一致を確認する対象
| 対象 | Excel と照合する内容 |
|---|---|
| 計算結果 | 内部の数値、文字列、論理値、エラー、空白。丸めた表示が同じだけでは一致としません。 |
| 評価規則 | どの入力を型変換・無視するか、どのエラーを優先するか、単一値と配列のどちらを返すか。 |
| 保存された数式とブックの状態 | 数式表記、旧来の配列数式の編集、挿入時の書式、ピボットのセル値、グラフの参照とキャッシュ。 |
表の見方
- ありがちな答えは、素直な実装が返しやすい値です。IEEE 754 の演算結果をそのまま使う、標準的な暦ライブラリを使う、Unicode の文字列比較をそのまま使う、といった実装を想定しています。答えとしては筋が通っていますが Excel とは違うため、Excel で作ったブックを再計算すると結果が変わります。この列は想定した実装例であり、他製品の測定結果ではありません。「—」は比較用の別の答えを示していない行です。
- Excel は Excel から取得した値です。
mac-365-ja_JPは日本語ロケールの Mac 版 Excel 365 を表します。詳しくはロケールプロファイルを参照してください。 - Formulon は、表が画面に入った時点でその場で計算します。ケースによっては事前にセルへ値を入れており、その内容を数式の下に示しています。数式自体は
Z1に入っています。数値はセルの表示文字列ではなく double の値として、許容誤差なしで比較します。実行バージョンは各デモに表示します。リリース準備中は、ドキュメントの対象より前の公開版が動く場合があります。
浮動小数点演算
2 進の浮動小数点では、0.5-0.4-0.1 に約 -2.78E-17 の誤差が残ります。Excel がこの誤差を 0 にするのは特定の文脈だけです。セル数式の一番外側の + または - では、左の被演算子の 2 進指数を基準とした 8 ULP(最下位桁の間隔の 8 倍)をしきい値として結果を判定します。式全体を括弧で囲むと、この規則は適用されません。比較演算も生の値を見るため、=0.5-0.4-0.1=0 は FALSE です。
SUM、AVERAGE、SUBTOTAL、AGGREGATE は、最後の加算だけにこの規則を適用し、その直前の部分和を基準にします。SUMIF は適用しません。途中の加算すべてで 0 に丸めると、長い合計式の結果が変わります。
この 3 式は、セルの結果、括弧内の式、論理値を返す比較という別々の評価経路を確認します。1 つの経路が合うだけでは、ほかの経路の一致は確認できません。
表では、数値の文字列化に有効数字 15 桁を使うことも確認しています。MROUND は入力した 10 進の値ではなく 2 進の値で計算します。負の底に分数の指数を付けた場合は、1/3 のような奇数乗根に限って計算します。
Windows プロファイルでは、Mac 版と異なる演算経路に、実測した Windows 版の丸め規則も適用します。これは後述するホストの数学ライブラリによる差とは別です。Excel プロファイルを選んでも、ネイティブや WASM の数学ライブラリが置き換わるわけではありません。
Excel の実測値と照合する
Excel の列は実機で取得した値です。Formulon の列は、このページの WASM エンジンが同じ数式を同じプロファイルで計算した結果です。
本物の Formulon エンジン (WASM) がこのページ内で動作します。データは送信されません。
表示桁数より細かい数値の一致
数値の読み取り、計算、表示には、それぞれ異なる規則があります。文字列から数値への変換は有効数字 15 桁で打ち切り、ROUND 系(ROUNDUP を含む)は有効数字 15 桁の 10 進表現に基づいて丸めるため、2 進数の誤差で 1 単位増えることはありません(ROUNDUP(0.1+0.2,1) は 0.3 です)。乗算、^、POWER などの結果が非正規化数(double の正規化範囲より小さい値)になると、0 にします。数値書式には、分数、指数、桁のプレースホルダーの規則もあります。分数書式の整数部にはロケールの桁区切りが付き、非正規化数の科学表記の指数は整数部のプレースホルダー数に従い、小数 127 桁の上限は保存された書式に対して検査します。すべての段階に同じ丸め処理を使うと結果が変わります。
次の Mac ja-JP の golden は、最下位桁まで照合する例です。スイートの指定、またはケースごとの上書きによって、いずれも実効の絶対・相対許容誤差を 0 としています。リンク先には Excel ビルド、取得日時、入力、比較条件も記録されています。ブラウザー上の表とは別に、ソースの回帰ケースとして示しています。
| 数式 | Excel から取得した数値 | 確認する挙動 |
|---|---|---|
=NUMBERVALUE("9999999999999999") | 9999999999999990 | 文字列からの変換を、Excel の有効桁数で打ち切ります。Golden: integer_digits_truncated。 |
=ROUNDUP(2.675,2) | 2.6799999999999997 | セルには 2.68 と表示できても、内部の double は違いを持ちます。Golden: round_digit_string_roundup_cents。 |
=ROUND(99.995,2) | 100 | 小数の丸めが整数部へ桁上がりします。Golden: round_digit_string_round_carry。 |
=RATE(10,-100,1000) | -1.963351707292562E-10 | 数学的に厳密な 0 に置き換えず、Excel のソルバーが返す微小な残差を再現します。Golden: rate_zero_outcome。 |
=NORM.DIST(17.947,-3.482,1.962,FALSE) | 2.538700187017102E-27 | 広い絶対許容誤差で、分布の裾の微小な非ゼロ値を見落とさないようにします。Golden: norm_dist_pdf_far_tail。 |
=NORM.DIST(39,1,1,FALSE) | 0 | Excel が 0 にする領域を、別のケースで確認します。Golden: norm_dist_pdf_flushed。 |
金融・統計関数では、標準的な数式だけでは結果がそろいません。RATE、IRR、XIRR、YIELD は、初期推定値や解けない場合を含め、Excel のソルバーの挙動に合わせています。分布の裾と逆関数、桁落ちする分散、列同士が従属する回帰でも、異なる数値計算の経路を確認しています。入力と比較条件は RATE / IRR、XIRR、YIELD、回帰分析のケース群で確認できます。単純な支払額や平均が合うことだけでは、これらの境界条件の一致は確認できません。
日付と時刻
シリアル値
Excel は日付を数値で保存します。1900 年の初めからの日数で、1 が 1900-01-01、45658 が 2025-01-01 です。日付の計算にはこのシリアル値を使います。
シリアル値 60 は 1900-02-29 で、実在しない日付です。Excel は古いブックの日付を変えないためにこの日を残しており、WORKDAY もこの日を営業日として数えます。この番号付けを再現するには、グレゴリオ暦の計算とは別にシリアル値 60 を扱う必要があります。シリアル値 0 は、1899 年の最終日ではなく 1900/1/0 と表示されます。
和暦にも独自の規則があります。DATEVALUE は 令和元年 という元年表記を受け付けませんが、平成が終わった後の 平成32年 は受け付けます。TEXT に元号コード ggge を指定すると 令和1年 と出力し、元年 と表記するのは書式に [$-ja-JP-x-gannen] タグがある場合だけです。TIMEVALUE("12:60") はエラーにならず、13:00 に繰り上がります。Windows ja-JP では、TEXT が書式の配列を受け付け、[$-LCID] タグは Windows 自身の月名・曜日名で表示されます([$-411]mmm は 1、[$-404]mmmm は 一月)。
1904 年日付システムで保存されたブックは、そのシステムのまま読み込みます。シリアル値 0 は 1904-01-01 になり、負のシリアル値はエラーではなく反転した日付(-1904/1/2)として書式化されます。
Excel の実測値と照合する
Excel の列は実機で取得した値です。Formulon の列は、このページの WASM エンジンが同じ数式を同じプロファイルで計算した結果です。
本物の Formulon エンジン (WASM) がこのページ内で動作します。データは送信されません。
空白セル、空文字列、型変換
Excel は「何もない」状態を 3 種類区別します。一度も書き込まれていないセル、長さ 0 の文字列定数を持つセル、"" を返す数式です。COUNTIF はこの 3 つを区別します。条件 "" は 3 つすべてに一致し、条件 "=" は本当に空のセルだけに一致します。
論理値に見える文字列の扱いも関数ごとに違います。IF は文字列 "TRUE" を受け付けますが、" TRUE " は受け付けません。AND は前後の空白を取り除いて受け付けます。SUM は引数に直接書いた "TRUE" を拒否します。論理値と数値は等しくならないので、TRUE=1 は FALSE です。日本語プロファイルの VALUE は先頭の ¥ を受け付けますが、末尾の 円 は受け付けません。VALUE と文字列から数値への変換は、先頭の桁グループがすべて 0 のときだけ、桁区切り付きの数値を拒否します。046.565.118 は de-DE、043,472 は en-US で解釈できますが、de-DE の 000.509 と en-US の 0,123 は #VALUE! です。
Excel の実測値と照合する
Excel の列は実機で取得した値です。Formulon の列は、このページの WASM エンジンが同じ数式を同じプロファイルで計算した結果です。
本物の Formulon エンジン (WASM) がこのページ内で動作します。データは送信されません。
ロケールと OS による文字列比較
2 つの文字列が一致するかどうかは、ロケールと、Excel が動いている OS によって変わります。日本語プロファイルの SUMIF の条件では、ひらがなとカタカナ、全角と半角、丸数字と通常の数字、ß と ss をそれぞれ同じ文字として扱います。ä と a は同じに扱いません。長音記号 ー は、日本語プロファイルでは直前の母音と同じに扱い、英語とドイツ語のプロファイルでは別の文字として扱います。
同じロケールでも、Mac 版と Windows 版の Excel は答えが違います。下の表では、ア が入ったセルから あ を探す MATCH が、Mac 版では見つかり、Windows 版では見つかりません。CODE と LENB は、それぞれのプラットフォームの古い文字セットに基づいて答えます。Windows ja-JP ではハングルが CP932 の 1 バイト ? として扱われ、CODE("한") は 63、LENB("한글") は 2 です。Formulon は、対応するプロファイルを選べばそれぞれのプラットフォームと同じ答えを返します。
プラットフォームに依存しないケースも 2 つあります。COUNTIF のワイルドカードは文字列にしか一致しないので、"12*" は数値の 1213 を数えません。ヴ は半角 1 文字で表せないので、ASC はそのまま返します。
大文字と小文字を区別せずに比較する関数と、完全一致で比較する関数の違いは文字列の比較と並べ替えで説明しています。
Excel の実測値と照合する
Excel の列は実機で取得した値です。Formulon の列は、このページの WASM エンジンが同じ数式を同じプロファイルで計算した結果です。
本物の Formulon エンジン (WASM) がこのページ内で動作します。データは送信されません。
検索の経路と文字の位置
近似検索では、型が混在する範囲や未整列の範囲を含むプローブから、Excel の検索経路を確認しています。A1:A3 が 30、10、20 のとき、Excel の =MATCH(15,A1:A3,1) は 2 を返します(golden: match_unsorted_with_approx、許容誤差 0)。これは 1 つの実測上の検索経路を固定する例です。近似検索で必要な整列済みの入力を、未整列でもよいとする保証ではありません。
文字位置もプロファイルに依存します。Mac ja-JP の文字列の goldenでは、=LEN("😀") は 1(supp_len_emoji)、=FIND("b","a😀b𐐨c𠀀d") は 3(supp_find_after_astral)です。通常の文字に加え、補助文字を含む文字数と位置も検証しています。これらは Mac の取得値で、すべての Windows ロケールの直接実測ではありません。比較時に同一視する文字は文字列の照合、実測の範囲はロケールプロファイルを参照してください。
暗黙の共通部分とスピル
暗黙の共通部分とスピル
値を 1 つだけ受け取る場所に範囲を書くと、数式と同じ行(または列)のセル 1 つに絞り込まれます。これが暗黙の共通部分で、@ 演算子はこの絞り込みを明示的に指定します。複数の値を返す数式は、その値を右下方向のセルに展開します。これをスピルと呼び、展開先のセルが 1 つでも埋まっていると #SPILL! を返します。
1 行目に書いた =@A1:A5 は A1 の値を返します。1 行目に書いた =@A3:A8 は範囲内に 1 行目のセルがないので、#VALUE! を返します。="" を持つセルは空に見えますが、スピルを妨げます。結合セルも同じです。
検索関数に配列でキーを渡した場合、Excel のエラーの優先順位は要素ごとに適用されます。=VLOOKUP(A1:A2,D1:E2,3,FALSE) では、列番号 3 はどの要素にとっても不正ですが、キー自体がエラーの要素はそのキーのエラーを返します。
Excel の実測値と照合する
Excel の列は実機で取得した値です。Formulon の列は、このページの WASM エンジンが同じ数式を同じプロファイルで計算した結果です。
本物の Formulon エンジン (WASM) がこのページ内で動作します。データは送信されません。
編集・保存した後の正確さ
数式の値が一致しても、次の編集で同じ挙動になるとは限りません。次の検証では、ワークブックの状態と編集結果も確認しています。
| 分野 | 確認する挙動 | 検証元 |
|---|---|---|
| 数式入力 | 1.50 を 1.5、数値に接する単項 +5 を 5 として保存し、拒否する空白は変更前にエラーにします。セル、定義名、条件付き書式、入力規則で共通の入力規則を使います。 | 数式入力の回帰テスト、ワークブック操作。 |
| 数式のネスト | 関数呼び出しが 65 段を超えてネストした数式は NestedFormulaTooDeep で拒否されます。丸括弧 256 段、単項符号 1024 個までは解析と評価ができます。 | エラーモデル。 |
| シート名 | アポストロフィで始まる、または終わる名前は、追加と名前変更で拒否され、ファイルの読み込みも失敗します。大文字小文字を問わず History は、Excel と同じく win-* プロファイルでは拒否、mac-* プロファイルでは受け付けます。 | ステータス。 |
| 旧来の配列数式 | 起点以外への編集はブロックを変えずに拒否します。すべてのメンバーセルが、ブロックの数式に基づいて FORMULATEXT と ISFORMULA に答えます。 | 動的配列。 |
| 入力規則 | 自己参照する式は、範囲や間接参照も含めて入力候補を使い、保存済みセルは変更せずに判定します。 | 入力候補の回帰テスト、フィルターと入力規則。 |
| 行・列の編集 | 挿入行は上の行の書式と高さ、挿入列は左の列の書式と幅を引き継ぎます。スパークラインは複製し、非表示状態とアウトラインレベルは引き継ぎません。データテーブル、旧来の配列ブロック、ピボットテーブルを横切る挿入と削除は kPreconditionFailed で拒否します。 | ワークブック操作。 |
| ピボット | Windows ja-JP の blank_row_item_label は出力グリッド、ラベル、総計を照合します。(North,100)、(空白,50)、(South,200)、(空白,25) から、空白ラベルのグループは 75、総計は 375 になります。 | ワークブックの golden、ピボット。 |
| グラフ | 系列キャッシュは空白・文字列・論理値・エラーを区別します。構造の編集に参照が追随し、保存時には保持しているセル値からキャッシュを更新します。データと構造の検証であり、グラフ描画の一致は対象外です。 | グラフデータの golden、保存の回帰テスト、グラフ。 |
リンク先の golden は Excel の取得値です。回帰テストにはエンジンと API の契約を固定するものもあり、回帰テストだけを新たな Excel 実測とは扱いません。読み取り・編集・保存の対応範囲は、各機能ページで説明しています。
比較の成功が示す範囲
| 比較方法 | 一致とする範囲 |
|---|---|
| このページのライブ表 | 数値は double の値で許容誤差なしに比較し、文字列・エラー・論理値は表に示す表現で比較します。 |
| 厳密な Oracle ケース | 実効の絶対・相対許容誤差がともに 0 です。上の RATE のように、ケース単位でスイートの許容誤差を上書きできます。 |
| 許容誤差・専用比較を持つ Oracle ケース | そのケースに適用される許容誤差や、指定した比較方法の範囲で一致を確認します。 |
host_libm のケース | 対象として指定した数学ライブラリ由来の結果は、macOS では厳密一致、ほかのホストでは最大 4 ULP で比較します。Linux や WASM の結果が Mac 版 Excel から 1〜2 ULP 異なる場合があり、Mac プロファイルの選択だけでは実行ホストの差はなくなりません。 |
この例外は host_libm のレジストリ項目と比較処理で明示しています。数学関数全体への一律の許容誤差ではありません。スキップしたケースは値の一致を示さず、次の節で別に扱います。
残っている差分
コアリポジトリの tests/divergence.yaml とターゲット別レジストリには、差分の理由、対象プロファイル、比較方法、最後に確認した Excel ビルドを記録しています。意図的な制約だけでなく、安定して取得できないケースも含まれます。スキップしたケースは、一致を確認できたケースにはなりません。
| ケース | Excel | Formulon | 理由・制約 |
|---|---|---|---|
| 反復計算なしの複数セル循環 | A1=B1+1、B1=A1+1 は入力順序によって 1 と 0、または 0 と 1 | 循環するすべてのセルが #REF! | 保存ファイルには、結果の再現に必要な入力順序が残りません。A1=A1+1 のように自分自身だけを巡る循環は、どちらも 0 です。 |
| 反復計算なしで循環を参照する下流セル | 循環が閉じる前と後のどちらで入力したかによっても結果が変化 | 複数セル循環からは #REF! が伝播。自己循環の下流は 0 をもとに計算 | Excel の過去の入力順序はワークブックから復元できません。 |
Mac の =WEEKNUM(DATE(2024,1,1),99) | セルや実行によって 1 と #NUM! の間で変動 | 未対応の戻り値型はすべてのホストで #NUM! | 再現可能な Mac の値がないため、excel-no-value に分類します。 |
| Excel のサイズ上限以内の配列 | Mac Excel 365 は 107,374,182 要素まで評価可能(A:CX+0 は評価でき、A:CY+0 と SEQUENCE(1048576,103) は数値 0)。Windows Excel はそれより小さい配列でも破棄することがある | 生成配列は 1,048,576 セル、派生配列は 10,000,000 セルまで。超えると #NUM! または #CALC! | WASM のメモリ使用量を制限します。107,374,182 の上限はどのプロファイルにも適用され、超えた数式はどちらも 0 になります。SUM、AVERAGE、MIN、MAX、PRODUCT、COUNTA は、列全体・行全体の演算結果を実体化せずに畳み込み、ROWS と COLUMNS は値を確保せずに形状を取得できます。 |
空の A1 を起点とする =A1+1 のアドホックなスカラー評価 | 自動計算でセルに保存した自己循環は 0 | キャッシュされた空白セルを参照して 1 | アドホック評価は数式を保存せず、依存グラフにも登録しません。ワークブック操作を参照してください。 |
| Windows の印刷倍率の取得データ | 倍率変更後のレイアウトが確定する前に、前の改ページ位置を取得した可能性あり | ページ寸法に基づく改ページが Mac の実測ケースと一致 | harness-cannot-capture に分類し、Windows でレイアウト確定後の再取得が必要です。古い取得値を Excel 全体の改ページ規則とは扱いません。 |
差分を詰める手順
- プロファイル、日付システム、入力セル、計算設定をそろえます。Excel ビルドを記録し、再現できる最小のワークブックに絞ります。
- Excel の結果と、必要に応じて保存された数式を取得します。エンジンの差分と、取得ツールの制約、変動する入力、プロファイルやビルドの変更を切り分けます。
- 実測値を根拠に実装を修正し、回帰ケースを追加します。丸めの境目、空白、エラーの優先順位、ロケール、配列の形状も確認します。
- 解消したスキップや許容誤差の項目を削除し、コミット済みの golden と差分レジストリを検証します。golden を変更するのは、Excel で再取得した観測結果がある場合です。
検証コマンドと、網羅性のメタデータ・リリース合格条件がそれぞれ示す範囲は Oracle テストを参照してください。取得したケースの成功だけでは、すべての入力や Excel ビルドでの一致は証明できません。
取得データを最新に保つ仕組み
- Formulon のプロファイルは 28 個あります。このうち 15 個(Mac の 14 ロケールすべてと Windows の
ja_JP)は Excel で直接計測しています。残る 13 個の Windows プロファイルは、Mac での計測値に Windows ホストの規則を当てはめて推定しています。 - Mac の全ロケールの数式の取得データは、CI でテストとして実行します。取得データと結果が違えば、divergence の記録がない限りビルドが失敗します。対応するケースのない divergence の記録も失敗になります。
- ブック単位の挙動(ピボットテーブルと印刷レイアウト)は、Excel の自動操作が安定している Windows 版 Excel の
ja_JPから取得しています。
取得の種類と失敗時の切り分けは Oracle テスト、プロファイルの考え方は互換性モデルで説明しています。
保証していないこと
ここに挙げたケースが一致しても、あらゆるブックがあらゆる Excel のビルドと一致するわけではありません。ja_JP 以外の Windows プロファイルは推定値です。Excel 自体もビルドごとに挙動が変わります。お使いのブックが、上の例ほど細かく検証していない関数を使っている可能性もあります。利用者の環境に合うプロファイルを setExcelProfileId() で固定し、Excel での結果が分かっている自分のブックをいくつかテスト用に残してください。
次に読む
- 数式カバレッジ — 実装済みの関数。
- ロケールプロファイル — 28 個のプロファイルと固定のしかた。
- Oracle テスト — 取得データの作り方と検証方法。