私はプログラム初心者ですが、VC++2005を使った計算を急遽しなければならなくなってしまいました。どうかよろしくお願いします。三角関数,逆三角関数の計算をしようとしたんですが、以下のエラーが出てきました。
「c2665:'asin':3 オーバーロードのどれも、全ての引数の型を変換できませんでした」
考えられる原因と対処法を教えていただきたいです。できれば具体的に教えていただけるとうれしいです。よろしくお願いします。
開発環境:Windows XP,VC++2005,CLR ウィンドウズフォームアプリケーション
エラーとなったソースを見せて。
どんな型の何を引数に与えたかわかるやつを。
一部ですが・・
complex<double> N[10];
N[3]=double::Parse(textBox7->Text);
N[2]=double::Parse(textBox8->Text);
N[1]=double::Parse(textBox9->Text);
N[0]=double::Parse(textBox10->Text);
〜途中省略〜
complex<double> fai_e[10];
fai_e[0]=fai_0;
fai_0=fai_0*M_PI/180;
fai_e[1]=asin((N[0]/N[1])*sin(fai_e[0]));
fai_e[2]=asin((N[1]/N[2])*sin(fai_e[1]));
fai_e[3]=asin((N[2]/N[3])*sin(fai_e[2]));
回答じゃないけど、初心者で独学ならコンソールアプリでfloatやdoubleから始めたほうが良いと思うけどね。
それはプログラム初心者に書けるソースじゃないと思うけど、元ネタの提供者がいるならその人に聞く方がいい。
どっかからのコピペなら、それを参考にするのはやめて、「HellowWorld」から始めなされ。
asinでcomplex<double>を引数に取れるものがないんじゃないすか?
基本的な質問になってしまうかもしれませんが、<complex>ヘッダとか<cmath>ヘッダを用いても、sinとかasinの引数として複素数が入った計算はできないのでしょうか?何か根本的なところが間違っている気がするのですが・・下に一連のエラーメッセージを示しますので、何かお気づきの点がございましたら教えていただきたいです。
c:\documents and settings\東芝\my documents\visual studio 2005\projects\emission spectrum analysis\emission spectrum analysis\Form1.h(1879) : error C2665: 'asin' : 3 オーバーロードのどれも、すべての引数の型を変換できませんでした
C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(108): 'double asin(double)' の可能性があります。
C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(495): または 'float asin(float)'
C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(543): または 'long double asin(long double)'
引数リスト '(std::complex<double>)' を一致させようとしているとき
>何か根本的なところが間違っている
まさにそのとおり。
東芝さんかその外注先が仕事でやってるなら、周りの人に聞いた方がいいよ。
君の質問は入門書1冊を丸まる手取り足取り教えてくださいと言ってるようなものだから。その質問に答えてもすぐに次の質問が出てきてきりが無い。
どうしても回りに聞けないなら入門書を買ってきなさい。
> sinとかasinの引数として複素数が入った計算はできないのでしょうか?
sinとかasinの引数として何が許されているかはマニュアルを読んでください。
いろいろご返信ありがとうございます。やはりsinやasinは複素数を引数として取れないみたいです。ではどういう表記にすれば複素数計算ができるのか調べているんですが、どうも分かりません。casinとか(例えばですが)、何か特別な表記法が存在するのでしょうか?
>何か根本的なところが間違っている
失礼とは思いますが、複素数の意味を理解していないように感じます。
実部だけ使用し、complex<double> の虚部が常に 0.0 で使用してませんか?
complex を vector に変えると希望することができるような気がします。
こうなるとあとは複素数のsinがどんな返り値となるのか数学公式集で調べてそれと同じことを実装するんじゃないかしら。
VC2005ってエラー表示がかなり分かりやすいですね。
>C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(108): 'double asin(double)' の可能性があります。
>C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(495): または 'float asin(float)'
>C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(543): または 'long double asin(long double)'
これって、asin は double, float, long double のいずれかのみに対応してうるってことが一発でわかる。
複素数領域に拡張したsinは公式で一発ですし、自前で計算しなくても、
<complex>をインクルードすればそれだけで使えるようになりますが、
複素数領域に拡張したasinって、何か数学的または慣用的な定義って
ありましたっけ?
例えば、sin(z)=2を満たす複素数zは、π/2 + j*(log(2 + √3)) と
π/2 + j*(log(2 - √3))のふたつがありますけど、複素数版のasinを
定義するならば、asin(2)を上記のどちらかに絞るか、何か適当な定義域を
定めて、このような曖昧な結果が出るzをasinに食わせるのはNGとする
必要があるわけで。
こういった定義ができないからSTLにも複素数版のasinが定義されて
いないのだと思い込んでいたけど、実際のところ、どうなんだろう。
遅くなりましたが、解決しました!
やはり標準ライブラリにasinの複素数版がないということで、Boostのインストールと計算式の変形という二つの選択肢のうち、計算式を変形することで解決しました。Boostの方はなぜかうまくいかなかったのですが..
みなさんいろいろありがとうございました。夜中の3時とか4時くらいの返信の方とか、ご迷惑おかけしました。
ツイート | ![]() |