こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語の複素数についてです。

C言語で複素数を使うことになりましたが、複素数をプログラム上でどう使うかわかりません。

粒子の複素屈折率を計算してシミュレーションするというものです。

その複素屈折率は
0.57+2.74i

と表されます。iが虚数です。

一般的にCプログラムで複素数を使えるようにする一番簡単な方法はなんでしょうか?
具体的に参考にできるプログラムコードとかあれば是非教えて下さい。
#define complex
とか使うのでしょうか?

おそらくcomplexというものを使うんだとは思います。実数部と虚数部を分けて考えるのでしょうか。

C言語、いまいちよくわからなくて……どなたか詳しい方、教えて下さい。

投稿日時 - 2012-05-08 21:06:36

QNo.7465234

すぐに回答ほしいです

質問者が選んだベストアンサー

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などの複素数型や,通常の演算子を使っての演算はできません。
その場合は,処理系が複素数演算のためのライブラリを独自に用意してくれているかもしれません。

投稿日時 - 2012-05-09 13:46:01

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

そして #include <complex.h> のもとでは
#define complex _Complex
が有効になるので
double complex
なども使える, ですよね>#4. なお Visual Studio 2010 の VC には complex.h が存在しない模様.

それにしても #3 に出てくる「クラスをサポートするC」ってなんだろ....

投稿日時 - 2012-05-09 16:20:34

 #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桁)でおやりなさい、という事だと思います。複素数は、実数のペアと同値ですから。

投稿日時 - 2012-05-09 09:44:33

ANo.2

double complex などの方がよいかもしれません>#1.

投稿日時 - 2012-05-08 23:00:45

ANo.1

お使いのコンパイラーが複素数をサポートしていて、
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;
}

投稿日時 - 2012-05-08 22:01:34

あなたにオススメの質問