![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# あまりわかりません。 複素数$c$を具体的に定めた複素写像写像$f_c(z)$に対して、原点を含む領 4 2022/10/25 09:17
- 数学 複素関数にロピタルの定理を使おうとしている回答者は、複素関数論はおろか微積分学もよく分かっていない、 5 2022/12/28 18:02
- 高校 述語論理の基本的な質問 3 2022/04/23 10:35
- 数学 x^p-1=(x-1)(x-ζ)(x-ζ^2)・・・(x-ζ^p-1)と複素数の中で因数分解できる理 1 2022/11/23 14:59
- その他(教育・科学・学問) 関数、写像について 1 2022/04/10 23:45
- 数学 ピーマン予想。突如として数学史上に名を残すこととなる複素関数ピーマンゼータ関数が発見されたとします。 1 2022/05/30 20:49
- 数学 実数であるべきものに虚数を含む複素数が現れたときの対処法 4 2022/08/30 09:19
- その他(言語学・言語) ピダハン語 2 2022/07/14 12:41
- 数学 数学の複素数の証明問題です。 (1)複素数全体の集合に2要素間の実数と同様な大小を定義できないことを 2 2022/08/28 11:17
- 化学 シリコンの透過率についてです。 シリコンの波長633nmの可視光の透過率について複素屈折率から計算し 2 2023/02/07 11:32
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者 構造体 課題について
-
c言語で、繰り返し文の中で、0....
-
関数の積分を求めるプログラム...
-
C言語で2.5で割った余りを求...
-
c言語でDFTのプログラムを作成...
-
インデックスが配列の境界外です.
-
インデックスが配列の境界外で...
-
シンプソン公式の数値計算
-
VisualC++2005にてerror C2664...
-
MATLABで画像のヒストグラムを...
-
C言語でポインタを用いた平均,...
-
マチンの公式による円周率のプ...
-
C言語で内積、、、わかりません。
-
モンテカルロ法の面積近似
-
複利の利率を求めるプログラム...
-
SetPixel関数のmath.h
-
C言語を実行すると-infが出てき...
-
プログラムでの数字につく”f”の...
-
セグメントエラー
-
C言語 入力した数値の平均値の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C言語を実行すると-infが出てき...
-
float型とdouble型の変数の違い...
-
doubleの変数にintとintの割り...
-
c言語で、繰り返し文の中で、0....
-
C言語 関数プロトタイプ宣言の...
-
関数におけるif文とreturn文に...
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
至急です! マクロ定義で #defi...
-
doubleは常に%lfとするべきなのか
-
Cで3乗根を求める方法
-
-1.#IND00と出てしまうのですが...
-
C言語で-23乗を取り扱うには
-
C++で外積
-
2次方程式の解を求めるプログ...
-
方程式を2分法を用いて解くプロ...
-
ニュートン法
-
c言語のコンパイルエラー canno...
-
difftime()について
おすすめ情報