- ベストアンサー
C言語で複素数を使う方法とは?
- C言語で複素数を使う方法について詳しく教えてください。
- 複素数をプログラム上でどのように扱えばいいのかわかりません。
- C言語で複素数を表現する方法や参考になるプログラムコードがあれば教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
C自体,以下の3種類の複素数型をサポートしています。 float _Complex double _Complex long double _Complex ref) ISO/IEC 9899:1999 6. Lanugages / 6.2 Concepts / 6.2.5 Types / Paragraph 11 加減乗除は通常の演算子を利用して可能です。 虚数単位は<complex.h>で定義されるため,実質的には<complex.h>のインクルードが必要になります。 ref) 同 7.Library / 7.3 Complex arithmatic <complex.h> / Paragraph 4 ただし,複素数型はC99と呼ばれる,1999年改正の規格でサポートされた型です。 コンパイラによってはC99を(一切 or 部分的に)サポートしていない場合があります。 複素数型をサポートしていない倍,double _Complexなどの複素数型や,通常の演算子を使っての演算はできません。 その場合は,処理系が複素数演算のためのライブラリを独自に用意してくれているかもしれません。
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
そして #include <complex.h> のもとでは #define complex _Complex が有効になるので double complex なども使える, ですよね>#4. なお Visual Studio 2010 の VC には complex.h が存在しない模様. それにしても #3 に出てくる「クラスをサポートするC」ってなんだろ....
#define ディレクティブで複素数計算を実現する事は可能ですが、現在では少々古い方法になり、今ではクラスを用いてcomplex型を、自前で定義するのが標準だと思います。ただしクラスをサポートするCなら、自前で定義しなくても、事前にcomplex型がサポートされているとは思います。 complexクラス定義の内容は、概ね以下のようになるはずです。 1)クラスに、complex(複素数型)という名前をつける. 2)代入操作を定義する関数を書く(一般にコンストラクターと呼ばれます). complex n = 0.57 + 2.4 * I; などを可能にするため. 3)複素数用の四則演算を可能にする関数を書く. 4)実部,虚部,絶対値を取りだす関数を書く. 5)複素共役に関する関数を書く. 1)~5)ではもちろん、実数部と虚数部を分け、実数に関する演算を用いて、必要な関数を定義します。このような内容は通常、拡張子hのヘッダーファイルと呼ばれるファイルにまとめますが、それが#1さんの仰る「#include <complex.h>」の「complex.h」になりますので、まずコンパイラーがcomplex型をサポートするかどうか、調べるのが先決です。 >C言語、いまいちよくわからなくて…… どんな言語でも、純粋な言語リファレンスの部分は、同一です。 1)四足演算. 2)二値判断分岐. 3)繰り返しループ. 4)配列. どんなプログラムも、上記4つの組み合わせで書かれますし、多くは数学の数式と同じです。例えば、1)は+,-,*,/ の事だし、4)は行列と思えばそれまでです。 むしろ良くわからないのは、コンパイラーへの指示の部分です。 >#include <stdio.h> >#include <complex.h> #includeディレクティブは、<stdio.h>や<complex.h>の内容を続くコードに合体させてコンパイルせよという、コンパイラーへの指示になっています。これのあるおかげで、 >printf("%f\n", creal(n)); が動作します。<stdio.h>の内容は、モニターへの入出力関数で、この中でprintf関数が定義されています。creal関数は、複素数nの実部取り出しで、<complex.h>で定義されます。これらはマニュアルを調べるか、おぼえるしかないですが、きっと講義で教えてくれます。 あと#2さんの仰っている事は、物理の数値計算は倍精度実数型(有効数字16桁)でおやりなさい、という事だと思います。複素数は、実数のペアと同値ですから。
- Tacosan
- ベストアンサー率23% (3656/15482)
double complex などの方がよいかもしれません>#1.
- asuncion
- ベストアンサー率33% (2127/6289)
お使いのコンパイラーが複素数をサポートしていて、 complex.h というヘッダーファイルがあれば、 例えば下のコードのように、 実数部を取り出したり 虚数部を取り出したり 共役複素数の実数部を取り出したり 共役複素数の虚数部を取り出したり などということができます。 他にもいろいろな関数があって、実数の世界でできることは 同じようにできると思います。 調べてみてください。 #include <stdio.h> #include <complex.h> int main(void) { complex n = 0.57 + 2.4 * I; printf("%f\n", creal(n)); printf("%f\n", cimag(n)); printf("%f\n", creal(conj(n))); printf("%f\n", cimag(conj(n))); return 0; }