はじめに
数学的には明確な定義があるはずの複素数演算ですが、
実際にPython / C# / Excel / Windows電卓で同じ式を計算すると、
異なる結果が返ってくることがあります。
「同じ数式なのに、なぜ結果が異なるのか?」
という疑問をきっかけに、
複数の環境で複素数計算の比較実験を行いました。
本記事では、その結果と原因をまとめます。
検証環境
| 項目 | 内容 |
|---|---|
| OS | Windows 11 |
| Python | 3.14.0 |
| C# | .NET 8.0 |
| Excel | Microsoft 365 |
| Windows電卓 | 科学関数モード(複素数対応) |
※ すべて追加ライブラリ不要。再現可能です。
Pythonでの計算
ソースコード(calc.py)
import cmath
values = [-1, -5, 1j, 3+4j, -3+2j]
for v in values:
print(f"value: {v}")
print(f" sqrt: {cmath.sqrt(v)}")
print(f" log : {cmath.log(v)}")
print(f" sin : {cmath.sin(v)}")
print(f" cos : {cmath.cos(v)}")
print("---")
実行方法(cmd)
python calc.py
※環境によってはpy calc.pyの場合があります。
出力結果(生ログ)
>python calc.py
value: -1
sqrt: 1j
log : 3.141592653589793j
sin : (-0.8414709848078965+0j)
cos : (0.5403023058681398+0j)
---
value: -5
sqrt: 2.23606797749979j
log : (1.6094379124341003+3.141592653589793j)
sin : (0.9589242746631385+0j)
cos : (0.28366218546322625-0j)
---
value: 1j
sqrt: (0.7071067811865476+0.7071067811865475j)
log : 1.5707963267948966j
sin : 1.1752011936438014j
cos : (1.5430806348152437-0j)
---
value: (3+4j)
sqrt: (2+1j)
log : (1.6094379124341003+0.9272952180016122j)
sin : (3.853738037919377-27.016813258003936j)
cos : (-27.034945603074224-3.8511533348117775j)
---
value: (-3+2j)
sqrt: (0.5502505227003375+1.8173540210239707j)
log : (1.2824746787307684+2.5535900500422257j)
sin : (-0.5309210862485197-3.5905645899857794j)
cos : (-3.7245455049153224+0.5118225699873845j)
比較結果票(テンプレ)
| 式 | Python | C# (S-Calc) | Excel | 一般的な関数電卓(CAS非搭載) |
|---|---|---|---|---|
| log(-1) | 3.141592653589793i | 3.1415927i | 3.14159265358979i | 未対応 |
| sqrt(-5) | 2.23606797749979i | 2.236068i | 1.36975761385226E-16+2.23606797749979i | 未対応 |
| sin(i) | 1.1752011936438014i | 1.1752012i | 1.1752011936438i | 未対応 |
| cos(3+4i) | (-27.034945603074224-3.8511533348117775i) | -27.0349456-3.8511533i | -27.0349456030742-3.85115333481178i | 未対応 |
※結果のスクリーンショットは巻末に掲載いたします
なぜ計算結果が変わるのか?
1. 多価関数(Multi-valued Function)
-
log(z)やsqrt(z)は数学的には無数の解を持つ - 計算環境ごとに採用する解(主値)が異なる
2. 実装仕様の違い
| 環境 | 傾向 |
|---|---|
| Python | 数学仕様に忠実 |
| Excel | 一般利用者向け + 例外処理重視 |
| Windows電卓 | 実務向け簡易CAS |
| C#(S-Calc) | ライブラリ仕様 + 独自修正 |
3.UIと例外処理の違い
- Excel →
#NUM! - Python →
ValueErrororcmath返却 - 電卓 → 入力拒否 or 演算可
まとめ
- 同じ式でも、数学仕様・主値の違い・例外設計によって結果が変わる
- 実装する側は「どの仕様を採用するか」決める必要がある
補足
今回検証したC#の結果は、自作Windows向け関数電卓ソフト「S-Calc」の
内部演算処理によるものです。
内部ではxFunc.Mathをベースに、一部仕様修正を行っています。

