0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python / C# / Excel / Windows電卓で計算結果が異なる理由:複素数演算の仕様と実装のズレを比較して見た

Last updated at Posted at 2025-11-26

はじめに

数学的には明確な定義があるはずの複素数演算ですが、
実際に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 → ValueError or cmath返却
  • 電卓 → 入力拒否 or 演算可

まとめ

  • 同じ式でも、数学仕様・主値の違い・例外設計によって結果が変わる
  • 実装する側は「どの仕様を採用するか」決める必要がある

補足

今回検証したC#の結果は、自作Windows向け関数電卓ソフト「S-Calc」の
内部演算処理によるものです。
内部ではxFunc.Mathをベースに、一部仕様修正を行っています。


Excel,S-Calcでの計算結果

image.png
Excelでの計算結果

image.png
S-Calcでの計算結果

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?