• 締切済み

fortran:角度の範囲を限定させる

fortranについてはほとんど素人同然なのですが。。。 角度で任意に与えた実数を0から2πの範囲に限定させて三角関数で同じ値を与える数値を出力するプログラムの書き方を教えてください! たとえば、500度は0度から360度の間に限定して三角関数で同じ値を与えるのは500-360=140(度)です。 4.5πは0radから2πradの間に限定して同じ値を与えるのは4.5π-2π×2= 0.5π(rad)です。 これと同様に任意の実数を0radから2πradの間に限定して同じ値を与えるプログラムを知りたいのです。 とりあえず考えてみたのは、 任意の実数xをまずπで割った値mとmを超えない最大の偶数nの差m-nを取ってまたπを掛ければよいのですが、nをどうやって求めればよいのかで悩んでいます。 もしかしたらほかのもっと楽な方法があるのかもしれませんが、よろしくお願いします。

みんなの回答

  • colder
  • ベストアンサー率43% (30/69)
回答No.2

余りを求める関数 mod を使えばよい。

bilateraria165
質問者

お礼

回答ありがとうございます! 他の友人にも尋ねたところ、modを使ったやり方が 一番シンプルそうですね。 参考になりました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

>最大の偶数 とか考えなくても 2π(360度)で割って小数部分を捨てる(整数化)したものをnとして 角度-2π×n すればいいと思います。

bilateraria165
質問者

お礼

回答ありがとうございます! なるほどそういう方法もあるんですね。 参考になりました。

関連するQ&A

  • fortran

    fortranでn次正方行列の対角要素の和を求める関数副プログラムを作ろうと思います。 fortran初心者で、何から始めていいのかさっぱりワカリマセン。 ヒント・アドバイスがあればよろしくお願いいたします。

  •  Fortran90を授業でやっています。

     Fortran90を授業でやっています。 入力されたNまでの素数を配列で返す関数をつくって、それを主プログラムで呼び出して素数を出力するという問題です。  素数を関数を用いて配列で返すまでは出来ました。しかし、その関数( Sosuu(N)としました。 )の要素数を(1000)と設定したため、Sosuu(N)の1番目から100番目までは素数が入っているのですが、それ以降の要素は値がすべて0になってしまいます。  なので、WRITE(*,*)Sosuu(N) とすると、素数が列挙された後さらに0が列挙されてしまいます。 0が出力されない方法は何かありませんか?

  • 角度を求める問題です。

    数学というより算数の問題なのですが、 30m進む間に2mの高さを登る道があります。 勾配は何度でしょう。というものです。 恥ずかしながら三角関数の出し方を忘れてしまいました。 よろしくお願いします。

  • Fortranのプログラミングについて

    Fortranのプログラミングについて分からない事があり、質問させていただきます。ご回答いただければ幸いです。 現在、 R = 1 2 3 4 5 6 ・・・ 30 T = n1 n2 n3 n4 n5 n6 ・・・ n30 n1≦n2≦n3≦n4≦n5≦n6≦・・・≦n30 順位(R)と、順位に対応する値(T)のデータがあるのですが、値が同じ場合には 其々の順位を平均したものを割り振りたいと考えています。 例えば、 3位と4位と5位の値が同じ場合には、全てを4位として扱い、10位と11位の値が同じであればそれぞれを10.5位 とする様なプログラムを組み立てたいのですが、どの様にすればよいのか分かりません。 どなたか、お教えいただけないでしょうか?

  • fortranのプログラム

    fortranのプログラム 現在、fortranの勉強をしております。 そこで、質問があるのですが、 ある関数f(x,y,z)の座標(x,y,z)の値がデータとして与えられているとき、 S=10+f をfortranで計算したいと考えております。 ただ、関数fは複数(f1、f2、f3)あり、次々とfに代入してSを計算したいのですが、どのようにプログラムしたらいいか思いつきません。 どなたか、ヒントだけでもいいので、教えてください。 ちなみに、私が考えたプログラムは(下のプログラムはポイントだけ書いてあります。endやその他関係ないと思われるところは省いております。) do 100 k=1,3 S=S+fk(x,y,z) continue function f1 f1(s,t,u)=・・・ return end f2(s,t,u)=・・・ return end 使用しているバージョンは、fortran77(本当は90を使っているのですが、77だけで書いています)です。

  • データの数を数えるfortran プログラム

    横にm個、縦にn個の実数データが整然と並んでいます。ファイルを開いて読み込むのですが、縦横に何個のデータがあるかプログラムに感知させる方法があるでしょうか。 縦にn個のデータがあることは簡単でした。しかし横にm個あることを感知させるのが難しいです。今は、とにかく全データの個数を調べて、その個数をnで割って求めています。 全データを読む方はは、1個読んで巻き戻し、2個読んで巻き戻し、3個読んで巻き戻し、.... としてデータをこれ以上読めないというところまで読んでその個数が全データということになります。この部分がかなり時間を使います。データを開いてエディタで1行目のカラム数を数えればいいわけですが、プログラム的にはどうなるでしょうか。Cだったら、改行を感知させるという方法があるかもしれません。Fortranだったらどうなるでしょうか。 ※Fotranの専門の会議室がないのかなと思っていますが。

  • Fortran90/95の出力方法について

    Fortran90/95の出力方法について Fortran95において,変数の値をwrite文で出力した後に改行しない方法を教えてください. 具体的には次のProgram reiを用いて質問します. program rei implicit none integer i, n read(*,*) n do i = 1, n write(*,*) i end do end このプログラムを実行させnに3を代入すると次のように表示されます. 1 2 3 しかし,私としては次のように改行せずに表示させたいのです. 1 2 3 また,諸事情により配列は使用しません. プログラムをどのように改良すればよいのでしょうか.教えてください.

  • Fortran90についての質問です。

    Fortran90に関する問題です。 「正の整数mを正の整数nで割った余りrを求める手順を、組み込み関数MOD(m,n)を用いずに、単一の算術式で表せ」 このプログラム文を以下のように作成しました。ファイル名は「amari.f90」にしました。 INTEGER::m,n,f,r REAL::a,k PRINT*,'Input 正の整数' READ*,m,n a=REAL(m) k=a/n f=INT(k) IF(m>0,n>0) THEN r=m-(f*n) PRINT*,'余り=',r END IF END そして、Cygwin画面上で gfortran -o amari.exe amari.f90と打って、コンパイルしようとしたら以下のようなエラー文が出ました。 amari.f90:8.6: IF(m>0,n>0) THEN 1 Error: Syntax error in IF-expression at (1) amari.f90:11.3: END IF 1 Error: Expecting END PROGRAM statement at (1) プログラム文のどこの箇所が間違っているのかを教えていただけませんか?お願いします。

  • Fortran のコードについて

    古いフォートランのコードで、Cに直したいのですがコードが読めません。色々ウェブで調べてみましたが、コード自体に疑問を持っているので質問したいと思いました。 以下コードです。 FUNCTION RAND(K) INTEGER K, M, CONST1 REAL RAND, CONST2 PARAMETER (CONST1 = 2147483647, CONST2 = .4656613E-9) SAVE DATA M /0/ IF(M .EQ.0) M = K M = M * 65539 IF(M .LT. 0) M = (M + 1) + CONST1 RAND = M*CONST2 END 以下私の理解している事: 参考にしたページ: http://www.g.dendai.ac.jp/lecture/fortran/fort12.html 任意のKが関数に渡される。 関数は K*65539*CONST2をいつも返す。 私の疑問点は、どうして型宣言が行われていないのか? どうして関数は特定の値をいつも返すのに、IFの分岐が必要なのか?という事です。 私の理解していることが間違っているのでしょうか。 困ってます。アドバイスをよろしくお願いしますm(__;)m

  • fortran77で乱数を発生させたい

    fortran77で乱数を発生させたい こんばんわ。fortran77で乱数を発生させるにはどうすればいいのでしょうか? 調べてみるとfortran90ならば乱数の組み込み関数が用意されているようなのですが、fortran70にはないそうです。   real function random(i)    i=843314861*i+453816693    random=real(i)/2**31   end function   do 10 k=1,n    ransu(k)=random(i) 10 continue これを用いることで乱数が発生できると書いてあったのですが、オーバーフローしてしまったせいか、値がマイナスのものが出てきてしまい、うまくできませんでした。 これ以外にも方法はないでしょうか? 私の環境はsalford FTN77です。 回答よろしくお願いします。

専門家に質問してみよう