浮動小数点とS-Calcの精度保障の違いを解説 〜ExcelとC#の計算を比較〜
はじめに
Excelは日常業務に欠かせない優れた表計算ソフトですが、
「数学的に厳密な値」を求める時には注意が必要です。
次の計算をしてみましょう。
結果は:
一見ほぼ0ですが、厳密には0ではありません。
今回はこの差がどこから生まれるのか、
そして私が開発したWindows向け関数電卓ソフト S-Calc ではなぜ正確に0という解が得られるのかを解説します。
Excel内部でのPI()の扱い
Excelは IEEE754倍精度浮動小数点(double型) を用いて計算しています。
PI()は有限桁の近似値として格納されており、実際の値は次のようになります。
そのため、先に貼り付けた画像のような計算結果となり、厳密な0にはなりません。
これはバグではなく仕様であり、
浮動小数点を用いる以上、どの環境でも起こりうる現象です。
S-Calcの仕組み - 「数値演算」ではなく「式の評価」
一方、S-Calcは.NET向けのライブラリxFunc.Mathを使用しています。
このライブラリは単なる数値演算ライブラリではなく、
式(Expression)を解析して評価(Evaluate)する仕組みを備えています。
つまり、S-Calcがsin(π)を処理する際は、
次のような流れで動作しています。
ユーザ入力:sin(π)
↓
パーサが式を解析 → sin(SymbolicConstant.PI)
↓
シンボリック評価(symbolic evaluation)を実施
↓
結果:0
「symbolic(シンボリック)」とは何か?
「symbolic evaluation(記号的評価)」とは、
数値をそのまま評価するのではなく、記号(symbol)として保持・処理する手法です。
たとえば、次のように考えると分かりやすいです。
| 式 | 数値的評価(numeric) | 記号的評価(symbolic) |
|---|---|---|
| π | 3.115926535...(近似値) | π(記号として保持) |
| sin(π) | 1.22E-16(誤差) | 0(理論的に正しい) |
| sin(π/2) | 1.0(近似) | 1 (理論値として保持) |
.NETやC#標準との違い
C#や.NETには、標準で「symbolic evaluation」の機能はありません。
つまり、Math.Sin(Math.PI)のような記述では必ず浮動小数点誤差を伴います。
double result = Math.Sin(Math.PI);
Console.WriteLine(result); // 1.2246467991473532E-16
これに対し、xFunc.Mathは
"数値を扱う"のではなく、"式を構文木(expression tree)として解析・評価する" ことで、
定数や関数を抽象的(symbolic)に扱えます。
この仕組みを利用することで、S-Calcではsin(π)を「式」として正確に0に簡約できるのです。
精度保障の比較
| 項目 | Excel | S-Calc |
|---|---|---|
| πの扱い | 数値(近似値) | 記号(symbolic constant) |
| 計算方式 | 浮動小数点演算 | 数式解析+記号的評価 |
| 精度 | 約15~16桁 | 理論的に正確(誤差なし) |
| 目的 | 表計算・統計 | 数学・理系計算・研究 |
実際の比較
| Excel | S-Calc |
|---|---|
![]() |
![]() |
- Excel :
=SIN(PI())→ 1.22514845490862E-16 - S-Calc :
sin(π)→ 0
使い分けの考え方
| 用途 | 向いているツール |
|---|---|
| データ集計・表計算 | Excel |
| 理論計算・関数解析・誤差を嫌う計算 | S-Calc |
Excelは現場作業向け、
S-Calcは数式や理論ベースの研究・開発向けです。
まとめ
- Excelの誤差は 「計算ミス」ではなく「浮動小数点の限界」 によるもの
- S-Calcは数式を解析・評価するため、理論的に正しい結果を返せる
- 計算の「速度」を重視するならExcel、計算の「正確さ」を重視するならS-Calc
関連リンク
- 🖥️ 公式サイト:https://itechem.jp/scalc/
- 🛒 Microsoft Store:S-Calc を入手する
- ✍️ note 記事まとめ:https://note.com/itechem




