
C言語で複素数を使うことになりましたが、複素数をプログラム上でどう使うかわかりません。
粒子の複素屈折率を計算してシミュレーションするというものです。
その複素屈折率は
0.57+2.74i
と表されます。iが虚数です。
一般的にCプログラムで複素数を使えるようにする一番簡単な方法はなんでしょうか?
具体的に参考にできるプログラムコードとかあれば是非教えて下さい。
#define complex
とか使うのでしょうか?
おそらくcomplexというものを使うんだとは思います。実数部と虚数部を分けて考えるのでしょうか。
C言語、いまいちよくわからなくて……どなたか詳しい方、教えて下さい。
No.4ベストアンサー
- 回答日時:
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などの複素数型や,通常の演算子を使っての演算はできません。
その場合は,処理系が複素数演算のためのライブラリを独自に用意してくれているかもしれません。
No.5
- 回答日時:
そして #include <complex.h> のもとでは
#define complex _Complex
が有効になるので
double complex
なども使える, ですよね>#4. なお Visual Studio 2010 の VC には complex.h が存在しない模様.
それにしても #3 に出てくる「クラスをサポートするC」ってなんだろ....
No.3
- 回答日時:
#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桁)でおやりなさい、という事だと思います。複素数は、実数のペアと同値ですから。
No.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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
c言語で、繰り返し文の中で、0....
-
たくさんの数の平均を求める方...
-
割り算ができない
-
C言語でdouble型の小数点の引き...
-
C 開放してるのにエラー(doubl...
-
sin(x)の近似について
-
C言語で内積、、、わかりません。
-
ガウスの消去法
-
ボール同士の衝突
-
2次元配列 CXX0030とい...
-
C#イベント中の戻り値の設定の...
-
指数の表示
-
π
-
C言語(プログラミング)関連の質...
-
至急です! マクロ定義で #defi...
-
main.c:7:43: warning: implici...
-
2÷3などの余りについて
-
「Aに対するBの割合」と「Aに対...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C 開放してるのにエラー(doubl...
-
至急です! マクロ定義で #defi...
-
C言語を実行すると-infが出てき...
-
C言語の型による処理速度の違い
-
c言語で、繰り返し文の中で、0....
-
C言語 関数プロトタイプ宣言の...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
-1.#IND00と出てしまうのですが...
-
c言語のプログラミングについて...
-
C言語で台形公式を使った二重積...
-
C言語でdouble型の小数点の引き...
-
C言語のプログラムで#include<m...
-
2次方程式の解を求めるプログ...
-
C言語の複素数についてです。
-
doubleは常に%lfとするべきなのか
-
関数におけるif文とreturn文に...
-
difftime()について
-
int とdoubleの比較
おすすめ情報