dポイントプレゼントキャンペーン実施中!

初めて質問させて貰います。
質問するにあたり至らない点もあるかもしれませんが、その際は御指摘頂ければ随時訂正していきたいと考えています。
プログラムに関しては素人と考えてください。
複素数を使った計算プログラムを書きたく思い、色々と調べたところcomplexをincludeすれば複素数が定義できるという所まで調べられました。
早速調べたとおりにプログラムを書いてみたのですが、エラーが発生してしまいます。
エラーの示すことも、何故エラーがでたのかも分かりません。
よろしければ、御助言の方よろしくお願いします。

使用ソフト→
Microsoft Visual C++ 2008です。

以下プログラム(num001.cppで保存)→
#include<stdio.h>
#include<complex.h>
~以下略

という感じでプログラムを書いたのですが、コンパイルしてみると、以下のようなエラーが発生してしまいます。
以下発生したエラーです→
num001.cpp
C:\program\C++5.5\include\complex.h : warning
C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。
データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
C:\program\C++5.5\include\complex.h(3) : warning
C4068: 不明なプラグマがありました。
C:\program\C++5.5\include\stdcomp.h : warning
C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。
データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
C:\program\C++5.5\include\compnent.h : warning
C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。
データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
C:\program\C++5.5\include\rw/stddefs.h : warning
C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。
データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
C:\program\C++5.5\include\rw/stddefs.h(3) : warning
C4068: 不明なプラグマがありました。
C:\program\C++5.5\include\stdcomp.h : warning
C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。
データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
C:\program\C++5.5\include\rw/stdwind.h : warning
C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。
データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
C:\program\C++5.5\include\rw/stdwind.h(3) : warning
C4068: 不明なプラグマがありました。
C:\program\C++5.5\include\rw/stdwind.h(208) :warning
C4068: 不明なプラグマがありました。
C:\program\C++5.5\include\rw/stddefs.h(181) :warning
C4068: 不明なプラグマがありました。
C:\VC\INCLUDE\xlocale(342) : warning C4530: C++ 例外処理を使っていますが、アンワインド セマンティクスは有効にはなりません。/EHsc を指定してください。
C:\program\C++5.5\include\complex.h(1488) : warning
C4068: 不明なプラグマがありました。

よろしくお願いします。

A 回答 (7件)

まあ、そうですね。

C++に行くのも一つの手かも。

ただ、目的にも依りますが、「CからC++に言語を変える」んだったら、いっその事、複素数を最初からサポートしている別言語に変えても良いかもしれませんね。見る限り、オイラーの公式exp(iπ)計算したいだけかもしれませんし。

例えばPython

Python:
http://www.python.jp/Zope/

だと、

cametan@cametan-laptop:~$ python
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cmath # 複素数ライブラリをインポート
>>> cmath.exp(cmath.pi * 1j) #オイラーの公式
(-1+1.2246063538223773e-16j)
>>>

とたった2行で結果が出ます。

Ruby:
http://www.ruby-lang.org/ja/

でも

cametan@cametan-laptop:~$ irb
irb(main):001:0> require 'complex' # 複素数クラスを導入
=> true
irb(main):002:0> Math.exp(Math::PI * Complex::I)
=> Complex(-1.0, 1.22460635382238e-16)
irb(main):003:0>

と実質二行ですね。

ANSI Common Lispだと、

CL-USER> (exp (* pi #c(0 1))) ; オイラーの公式
#C(-1.0d0 1.2246063538223773d-16)
CL-USER>

とたったの一行。
(実装は例えばWindowsならCLISP:
http://clisp.cons.org/
とか)
Schemeでも、

Welcome to MzScheme v4.2.1 [3m], Copyright (c) 2004-2009 PLT Scheme Inc.
> (exp (* pi 0+1i)) ; オイラーの公式
-1.0+1.2246063538223773e-16i
>

とまたもや1行です。
(実装は例えばWindowsならPLT Scheme:
http://www.plt-scheme.org/
とか)

まあ、これ考えてみるとcomplex.h探してコンパイルしなきゃなんない、って面倒って言えば面倒ですよね。

他にも、数値演算専用のMatlabと言う言語のクローン、GNU Octaveってのがあって、Windowsでは

Octave Workshop:
http://www.unige.ch/math/folks/loisel/www.math.m …

と言う統合環境があるんですが、これでも、

cametan@cametan-laptop:~$ octave
GNU Octave, version 3.0.1
Copyright (C) 2008 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTIBILITY or
FITNESS FOR A PARTICULAR PURPOSE. For details, type `warranty'.

Octave was configured for "i486-pc-linux-gnu".

Additional information about Octave is available at http://www.octave.org.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/help-wanted.html

Report bugs to <bug@octave.org> (but first, please read
http://www.octave.org/bugs.html to learn how to write a helpful report).

For information about changes from previous versions, type `news'.

octave:1> exp(pi * 1i) # オイラーの公式
ans = -1.0000e+00 + 1.2246e-16i
octave:2>

と、1行で済みますね。
(Octaveに関しては、以下の参考リンクを参照して下さい)

まあ、本当に目的にも依るんですが、場合によっては単に「数値計算したい」ってだけならC系で組むより別の言語でやった方が簡易に結果を見れる場合もあります。

参考までに。

参考URL:http://www.ishida-df.jp/octave/octave.html, http://octave.futene.net/
    • good
    • 0
この回答へのお礼

返答ありがとうございます。
あと、返信が遅くなってしまったこと申し訳ありません。

御助言いただいた「言語を変える」ということですが、申し訳ありません、今回はVisualStudioを使わなければいけないので、ご助言は嬉しかったのですが、今回は言語変えは無しの方向で行きたいと思います。
その他にも色々と参考まで出していただき、ありがとうございました。
これからも、よろしければ御助言などいただけたら幸いです。
それでは、ありがとございました。

お礼日時:2009/09/21 12:11

VisualStudio で複素数を使いたいなら, いっそ C++ にいってしまった方が楽な気がする. というか拡張子が cpp になってるから, コンパイラは C++ だと思っているはず.


#include <cstdio>
#include <complex>
#include <cmath>
using namespace std;

#ifndef M_PI
#define M_PI M_PI
const double M_PI = 4*atan(1.0);
#endif
int main(void){
complex<double> z, x;
x = complex<double>(0, M_PI);
z = exp(x);

printf("real=%f\timag=%f\n", z.real(), z.imag());

return 0;
}
って感じかな. VisualStudio はもう C の規格についていく気なさそうだし.
    • good
    • 0
この回答へのお礼

返答ありがとうございます。
少し返信が遅くなってしまい申し訳ありません。

ソースの提示までしていただき非常に助かります。
cppだとC++を意味しているんですね……すいません、初めてそのことに気付きました。
一度これでやってみます。ありがとうございました。

お礼日時:2009/09/21 12:08

どうなんでしょうねえ(笑)。



まず、僕が使ったコンパイラはgcc(GNU Compiler Collection)です。
まあ、BCCにもcomplex.hってのがある、って話が出てきましたが、それは使っていません。当然Visual C++でのコンパイルではない、のです。
紹介したminGWってのは、平たく言うと(正確じゃなく端折っていますが)、Windowsで使えるgccです。ですから、再現するにはminGWを入れるのが手っ取り早いだろう、って事ですね。

ええと、今Cの規格、って大まかに言うと3つあるんですよ。詳しくはWikipediaの記事を参照して欲しいんですが、

C言語:
http://ja.wikipedia.org/wiki/C%E8%A8%80%E8%AA%9E

今、最新規格は俗称C99って言われているものらしくって、複素数型はこれで追加された模様です。

C99:
http://ja.wikipedia.org/wiki/C99

ただ、ネットでザーッと検索した限り、Visual C++はどうやらC99には未対応みたいですね。残念ながら。
一応、complex.hに関する定義は、次のページで解説されています。

9. 標準ライブラリ(新規):
http://seclan.dll.jp/c99d/c99d09.htm

ただ、これを自分で実装するのは骨が折れるんじゃないでしょうか。メンド臭そうです(笑)。
素直に、C99対応のコンパイラを使った方が良いような気がしますね。僕はBCCは調べてないんですが、もしBCCでcomplex.hが使えるようだったら、それをダウンロードして使ってみるのが一番簡単じゃないか、とは思います。
CodeGearが買収されてから、ページ構成が変わっちゃって良く分かんなくなっちゃってんですが(笑)、多分このページ

Download a Trial or Free Version :
https://downloads.embarcadero.com/free/c_builder

の下から2番目の「C++ Compiler 5.5」ってのがBCC5.5かな?多分。良く分かりませんが(笑)。
まあ、このページはトライアル版かフリー版の提供ページなんで、間違ってダウンロードしてもそんなに酷い結果にはならないんじゃないか、って思うんですが(笑)。

BCCは割に有名で、有志によって次のようなフリーのIDEなんかも作られているんで、Visual C++から乗り換えてもそんなに困んないと思います(少なくとも、複素数絡みが問題だとして、bccでcomplex.hを使えるとすれば)。

CPad:
http://hp.vector.co.jp/authors/VA017148/pages/cp …

次のようなページもあるんで、参考までに。

Borland C++ Compiler のインストール:
http://homepage3.nifty.com/mmgames/c_guide/p_bcc …
    • good
    • 0
この回答へのお礼

再びの返答ありがとうございます。

幾つもの参照助かります。
薦められたように、一度どれかダウンロードしてコンパイルしてみます。
大して支障が無いとの御助言もありましたので、一度試して見ます。
色々と教えていただきありがとうございました。

お礼日時:2009/09/19 13:45

それはborlandのBCC5.5用のヘッダじゃないでしょうか


VisualC++では使えませんよ
VisualC++のincludeパスにBCC5.5用のパスが通ってるのも不思議ですが
    • good
    • 0
この回答へのお礼

返答ありがとうございます。

なるほど、やはりVisualStudionでは使えないヘッダなのですか……。
どうしても虚数を定義して扱いたいのですが、そういった場合どうすればいいでしょうか?
よろしければ教えてもらえると幸いです。
何度も聞いてしまうようで申し訳ないですが、よろしくお願いします。

お礼日時:2009/09/19 11:41

う~~ん、そうですねえ……。



うちの環境だと確かにコンパイル出来ました。

real=-1.000000imag=0.000000

ってのが欲しい結果でしょうか?

調べてみると、complex.hってのは、どうやらglibc(GNU C Library)の付属物のようですね。

GNU C Library:
http://www.gnu.org/software/libc/

ソースコードは以下の模様です。

complex.h:
http://www.google.co.jp/codesearch/p?hl=ja&sa=N& …

見た感じ、minGWには含まれているようなんで、「どーしてもコンパイルして動作を見たい」のなら、minGW

minGW:
http://www.mingw.org/

使った方がいいかもしれませんね。
minGWのインストール/設定は次のページ辺りを参考にして下さい。

MinGW のインストール:
http://www.knatech.info/Dev-mingw-install.html
「複素数<complex.h>のError」の回答画像3
    • good
    • 0
この回答へのお礼

返答ありがとうございます。

欲しい結果、まさにその通りです。
VisualStudioでcomplex.hを使えるようにする。ということはできるのでしょうか?
参照で載せていただいたURLを拝借させていただいたのですが、ちょっと自分では理解できませんでした……。
ソースを直接プログラム中に打ち込んだりしたらよいのでしょうか?
よろしければ、再びの御助言お願いいたします。
よろしくお願いします。

お礼日時:2009/09/19 11:39

残念ながら, VisualStudio 2008 に complex.h はないのですよ. ついでにいえば, ヘッダファイルがあるディレクトリに rw というサブディレクトリもありません.


ところで, あなたが使っているのは C と C++ のどちら? C++ なら, complex を #include すればいいだけなんだけど.
    • good
    • 0
この回答へのお礼

返答ありがとうございます。

すいません、実はCかC++なのかもよくわかっておりません。
VisualStudioにcomplex.hは無いのですか……分かりました。
ありがとうございます。
もしよろしければ、complex.hを使わずに虚数を定義するにはどうすればいいか、御教えいただけないでしょうか?
何度も頼ってしまうようで申し訳ないですが、よろしくお願いします。

お礼日時:2009/09/19 11:34

どのようなプログラムを書いたのですか?


その C:\program\C++5.5\include\complex.h とやらの中身はどうなっているのですか?
    • good
    • 0
この回答へのお礼

早速の返信ありがとうございます。

そもそもの考えが間違っているのかも知れませんが、complex.hはVisual C++についているものではないのですか?
付属しているものと思っているのですが……。

すいません、#include<math.h>を入力し忘れました。
プログラムの全容は以下の通りです→
#include <stdio.h>
#include <complex.h>
#include <math.h>

  int main(void){
double _Complex z, x;

x=I*M_PI;
z=cexp(x);

printf("real=%f\timag=%f\n", creal(z),cimag(z));

return 0;
}

よろしくお願いします。

お礼日時:2009/09/19 01:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!