複素数
複素数
どうもはじめまして。
わからないことがあって質問させていただきます。
複素数の割り算についてなのですが、まず
#include <stdio.h>
#include <math.h>
void xy_rt(double x,double y,double *pr,double *pt)
{
*pr=sqrt(x*x+y*y);
*pt=atan(y/x);
}
main()
{
double x1,y1,x2,y2,r1,t1,r2,t2;
if (scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2)!=4){
printf("4つ数字をいれてください\n");exit(1);
}
xy_rt(x1,y1,&r1,&t1);
xy_rt(x2,y2,&r2,&t2);
printf("答え=%6.2lf,%6.2lf\n",(r1/r2)*cos(t1-t2),
(r1/r2)*sin(t1-t2));
}
というプログラムができるのですが、atanは値域が-2/πから2/πでx>0,y>0またはx>0,y<0という制限があるのでx,yの符号から判断し、0から2πの角度を出力する2変数関数を新たに定義して書き換えてほしいのです。
本や、検索してもわからなかったので、自分なりにかんがえてz=a+biと考えて、やるのかとか、sinとcosの逆関数から判断するのかと思ったのですが、どうも角度を出力することができませんでした。
どなたかわかる方がいらしたら教えてください、お願いします。
ついでなのですが、実数部がゼロの場合に対応させるしかたも組み込んでくれるとありがたいです。
わからないことがあって質問させていただきます。
複素数の割り算についてなのですが、まず
#include <stdio.h>
#include <math.h>
void xy_rt(double x,double y,double *pr,double *pt)
{
*pr=sqrt(x*x+y*y);
*pt=atan(y/x);
}
main()
{
double x1,y1,x2,y2,r1,t1,r2,t2;
if (scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2)!=4){
printf("4つ数字をいれてください\n");exit(1);
}
xy_rt(x1,y1,&r1,&t1);
xy_rt(x2,y2,&r2,&t2);
printf("答え=%6.2lf,%6.2lf\n",(r1/r2)*cos(t1-t2),
(r1/r2)*sin(t1-t2));
}
というプログラムができるのですが、atanは値域が-2/πから2/πでx>0,y>0またはx>0,y<0という制限があるのでx,yの符号から判断し、0から2πの角度を出力する2変数関数を新たに定義して書き換えてほしいのです。
本や、検索してもわからなかったので、自分なりにかんがえてz=a+biと考えて、やるのかとか、sinとcosの逆関数から判断するのかと思ったのですが、どうも角度を出力することができませんでした。
どなたかわかる方がいらしたら教えてください、お願いします。
ついでなのですが、実数部がゼロの場合に対応させるしかたも組み込んでくれるとありがたいです。
Re:複素数
>「ライブラリ関数atanのかわりにx,yの符号から判断し、0から2πの範囲の角度を出力する2変数関数を新たに定義」
これを見る限り複素数でなくても良さそうですね。
x, y, atan(y/x)の正負に注目しましょう。
つまりatanの正負に加えてx, yの正負で場合分けすれば良いのです。
以下サンプルです。
これを見る限り複素数でなくても良さそうですね。
x, y, atan(y/x)の正負に注目しましょう。
x y atan(y/x) θ 正 正 正 0~π/2 負 負 正 π~3π/2となりますね。
つまりatanの正負に加えてx, yの正負で場合分けすれば良いのです。
以下サンプルです。
double theta = atan(y, x); if(theta >= 0) { if(x >= 0) return theta; else return theta + M_PI; }atan(y/x)が負のときは自分で考えてみてください。
Re:複素数
{double z,f; z=atan(y/x);
if(z >0) { if(x >0) return (z);
if(x < 0) z=z + pi; return (z); }
if(z < 0) { if(x > 0) f= pi*2; z=z + f; return (z);
if(x < 0) z=z + pi; return (z); }
if(z ==0) { if(x >0) return (0);
if(x < 0) return (pi); }
if(x == 0){ if(y>0) return (pi/2);
if(y<0) return (pi*3)/2; } }
としたのですが、どうも270度のときが二分の3πがでません。この場わけであっているでしょうか?どなたか教えてください。お願いします。
そもそもこのプログラムでいいのでしょうか?
if(z >0) { if(x >0) return (z);
if(x < 0) z=z + pi; return (z); }
if(z < 0) { if(x > 0) f= pi*2; z=z + f; return (z);
if(x < 0) z=z + pi; return (z); }
if(z ==0) { if(x >0) return (0);
if(x < 0) return (pi); }
if(x == 0){ if(y>0) return (pi/2);
if(y<0) return (pi*3)/2; } }
としたのですが、どうも270度のときが二分の3πがでません。この場わけであっているでしょうか?どなたか教えてください。お願いします。
そもそもこのプログラムでいいのでしょうか?
Re:複素数
ちょっとプログラムがごちゃごちゃしすぎて、どこに括弧がどこで閉じているかわからなくなっていませんか?
きちんと字下げしてみたほうがいいですよ。
間違いを減らすためにも。
前にも聞いたかもしれませんが、どうやって字下げしています?
きちんと字下げしてみたほうがいいですよ。
間違いを減らすためにも。
前にも聞いたかもしれませんが、どうやって字下げしています?
{ { double z,f; z=atan(y/x); if(z >0) { if(x >0) return (z); if(x < 0) z=z + pi; return (z); } if(z < 0) { if(x > 0) f= pi*2; z=z + f; return (z); if(x < 0) z=z + pi; return (z); } if(z ==0) { if(x >0) return (0); if(x < 0) return (pi); } if(x == 0){ if(y>0) return (pi/2); if(y<0) return (pi*3)/2; } } return 0; }このように綺麗に書いて対応を確認してみてください。