現在Fortranを使いプログラムをしていますが、円の面積を計算するため変数を定義しているところでおかしな問題が出てきました。円周率を定義するところで自分でつけた変数名 PAI の値が入力データと違うことに気づきました。以下のように簡単なプログラムを作って試したのですが結果は同じくおかしな値が出てきました。

IMPLICIT REAL*8(A-Z)
PAI=3.14159265
WRITE(*,1)PAI
1 FORMAT(E30.22)
PAUSE
END

結果は
0.3141592741012573000000E+01

とディスプレイに表示され、このあとにPAIを使った計算があるならこの値で計算されます。私としては、PAI=3.14159265と出力し、計算もしたいのですが...

これは FORTRAN 自体の特有の性質なのでしょうか、それともソフト、ハード的な問題なのでしょうか?

尚、変数 PAI をファイルから読み込んだり、PAI=4.0*ATAN(1.0) (PAI=3.1415926535897930 となりますが)、PAI=3.14159265D+00などにすると正確に表示、計算出来ます。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

こんにちはuni050というものです。



実際に試してみてわかった事を一つ。

i686、g77でコンパイルを行って試したところ実際にこの様になりました。で、次にalpha(OSF1)、g77で試してみたところ同じようになりました。そこで今度は、alpha、f77で試してみたら

0.3141592650000000208621E+01

となりました。そのほかにもいろいろ試してみたことから得られた結論として、数字がおかしくなるのはコンパイラの方の問題かと。

あと、ためしに
double precision pai
pai = 3.14159265
でg77でやってみたらうまくいきませんでした。おそらく入力する数字が単精度になっているから下の方の桁がうまく入らないのではないかと。これは推測なのであまり当てになさらずに。
    • good
    • 0
この回答へのお礼

何かいろいろなコンパイラがあるみたいですね。
いろいろ調べてみた結果コンパイラにも「あまく」コンパイルするのもあるみたいですね。ありがとうございました。

お礼日時:2002/02/06 08:53

IMPLICIT REAL*8(A-Z)


より.単精度の宣言の宣言をしていますので.有効桁は7.2桁になります。
3.14159265
より.7.2桁を超える数値を指定していますから.この値は倍精度です。定数ですから.コンパイラーは7.2桁に丸めた数値を変数PAIに設定します。
(E30.22)
より.E形式の出力を指定していますので.変数PAIの内容を単精度に換算して.その後に.30.22桁で表示します。

今のコンパイラーは型変換を自動でやってくれますから.このようなおかしな事になるのです(昔のコンパイラーでは型変換をせずメモリーから直接読み取るので.明らかに間違った答(0とか不の和とか)を出す)。簡単な方法としては
IMPLICIT REAL*8(A-Z)

を倍精度の宣言.たとえばダブルリアル(スペル忘却)宣言に直す方法があります。
    • good
    • 0
この回答へのお礼

いやー質問の最初に書いておくべきだったんですけど、どうしてこのような問題が起こったかというと、WARKSTATION (CPU:R10000,64bit)でコンパイル(Fortran は古い)して走らせるちゃんとPAI=3.1415926540000・・・と結果が出てくるんですよ。やっぱりbit数の関係ですかねー.(でもコンパイラは64bit対応か解らないんですけど。)
IMPLICIT REAL*8(A-Z)とIMPLICIT DOUBLE PRECISION(A-Z)は何か違うのですか?どちらも同じ意味と私は思っているんですけど。
どうもありがとうございました。

お礼日時:2002/02/06 09:29

> これは FORTRAN 自体の特有の性質なのでしょうか、それともソフト、ハード的な問題なのでしょうか?



どれでもありません。数学の問題です。つまり、2進数と10進数の間で、小数点数の変換を行なうと(ほとんどの場合)わずかな誤差が出てしまうのです。これを完璧に防ぐ方法は(特殊な方法を使う以外)ありません。FORTRANなどの技術計算用言語では、極端に言うとこれをあきらめています。倍精度を使ってもそれ以上の精度を採用しても誤差が小さくなるだけで、ゼロには決してなりません。

特殊な方法というのは10進数で計算を行なうのです。汎用の大型計算機では10進計算のハード(命令語)をもっていますし、商業計算が得意なCOBOL言語では、ハードがなくてもソフトで10進計算をやっています。

質問の答えにはならないかも知れませんが、(歯がゆい事ながら)技術計算では、色々工夫しながらFORTRANやCを使っていくしかないと思います。
    • good
    • 0
この回答へのお礼

確かに数学の話ですね。右辺を単精度で定義していたならこうなりますね。
10進数計算の話ですが最近は(昔からあるのかな?)BASIC にも2進数、10進数どちらでけいさんするのかを選ぶのもあるみたいですね。
どうもありがとうございました。

お礼日時:2002/02/06 09:16

No.3 の回答に補足。



コンパイルオプションで、定数を倍精度で扱うコンパイラもある(→参考URL)ので、
そっちの方も気にして見てください。

参考URL:http://www.compaq.co.jp/products/dvf/docs/vf-htm …
    • good
    • 0

> PAI=3.14159265



の右辺が *単精度* の表現であるから、なのだと思います。
コンパイラによっていろいろな表現があるのだと思いますが、例えば、参考URLに
よれば、

> 倍精度(8バイト)の実数定数は,定数値_8 で与える。

とありますので、

PAI=3.14159265_8

とすると、お望みの結果になりそうです。

まずは、お手持ちのコンパイラのマニュアルでデータ型とか定数とかの項を
読むことをお勧めします。

参考URL:http://www.media.kyoto-u.ac.jp/htomita/sec4.html …
    • good
    • 0
この回答へのお礼

あまりマニュアルを信用していない私ですが、のぞいてみたところ確かにそのように書いてありました。(倍精度型実数にはDをつけると)
どうもありがとうございました。

お礼日時:2002/02/06 09:03

PAI=3.14159265 の部分ですが左辺は倍精度実数、右辺は単精度実数(REAL*4)


です。
単精度実数の場合10進数にした場合有効桁数が6桁強程度しかありません。
倍精度実数は有効桁数が10進数で13桁程度ありますので代入した場合、単精
度実数で表せない部分にごみがはいります。
これを避ける為には右辺も倍精度実数にする必要があり、それが後編で試された
内容です。
FORTRANに限りませんが(C言語も同じです)、代入時の型に注意しないとこの
ような事がよくおこり原因不明の精度低下ということがあります。
なれると大丈夫なのですけどね。がんばって下さい。
    • good
    • 0
この回答へのお礼

本当に変数の定義のときには注意が必要ですね。
今までの私のプログラムは倍精度実数にすることなく定義しているので、これから一時はそれを直すのに時間がかかりそうです。(大変だーー)
どうもありがとうございます。

お礼日時:2002/02/06 08:59

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q地理についての質問です。 画像のアはタイ、エは日本を表しているのですが、どの部分を見たらこれがタイで

地理についての質問です。
画像のアはタイ、エは日本を表しているのですが、どの部分を見たらこれがタイでこれが日本とわかるのでしょうか。分かる方がいましたらご回答お願いしますm(__)m

Aベストアンサー

アのタイは簡単ですぐにわかります。お米の生産量です。タイはお米の大量生産国です。日本よりも遙かに多いでしょ。
平成に入って日本が米飢饉になった時、タイから大量にタイ米が輸入されたんですよ。

略地図のあ~うというのを見たいですね。

QFortranの変数の配列の設定値を計算中に設定するには?

FortranでプログラムをつくるときAという変数にBの値の範囲で配列を設定する。A(B)
このとき、プログラム作成時にはAには具体的な数値を設定しておかなくても良いですが、Bには具体的に配列の数を設定しておく必要があるように思います。
 質問は、
 プログラムが動く初めにはBに具体的な値を入れず、プログラム作動状況に応じてプログラム作動中にBの配列の範囲を設定できないものでしょうか?

Aベストアンサー

プログラム A がサブルーチンなら可能です。

メインプログラム
 C=10
 if( C .GT. 0 ) call A(C)
 STOP
 END
 
サブルーチン A
 sub A(B)
  dim(B)
 returne

Qパソコンでエクセルやワードで画像を貼り付けてサイズを変えたいのですがエ

パソコンでエクセルやワードで画像を貼り付けてサイズを変えたいのですがエクセルの画面上で画像を出すことができません。エクセルの画像を出してからどのように進んでいったらよいのか教えていただけませんか?

Aベストアンサー

画像の貼り付けは、クリップボード経由でコピペする事も可能です。


「Excel」 画像の貼り付けについて
http://www.geocities.jp/laut6/excel/excel1.html
https://www.slownet.ne.jp/sns/my/article/200611101627-1000000.html

Excel のセルに画像を埋め込む
https://www.slownet.ne.jp/sns/my/article/200611131440-2000000.html

複数の写真を1つの画像に、画像ビューワとExcelで簡単にまとめる方法
http://blog.falcon-space.net/tag/excel/
http://blog.falcon-space.net/cat/support-mom/

ワークシート上のコントロールをサイズ変更または書式設定する
http://office.microsoft.com/ja-jp/excel/HP102366941041.aspx

画像の貼り付けは、クリップボード経由でコピペする事も可能です。


「Excel」 画像の貼り付けについて
http://www.geocities.jp/laut6/excel/excel1.html
https://www.slownet.ne.jp/sns/my/article/200611101627-1000000.html

Excel のセルに画像を埋め込む
https://www.slownet.ne.jp/sns/my/article/200611131440-2000000.html

複数の写真を1つの画像に、画像ビューワとExcelで簡単にまとめる方法
http://blog.falcon-space.net/tag/excel/
http://blog.falcon-space.net/cat/support-mom/

...続きを読む

Qcommonで定義した変数を文字型に変換してファイル名に使いたいのですが(fortran)

たとえば計算ループの反復回数のカウントにniterという変数を使っているとします。
niterが10の倍数になる度にniterの数をファイル名にしてそれぞれの結果をそれぞれのファイルに出力したいのですが,うまくいきません。

open(10,file='file' // CHAR(ICHAR('0'+niter) // '.txt'
&,status='unknown')

のようにするようにと教わったのですが、これだけではうまくいかないので詳しい方教えていただけませんか? 

Aベストアンサー

詳しいというわけでもありませんが。

> CHAR(ICHAR('0')+niter)
これでは一桁の数にしか対応できないのではないでしょうか?
10の倍数であれば、10で割って
CHAR(ICHAR('0')+niter/10)
としてみては。
二桁以上に対応しようとすると、CHAR/ICHARでもできなくはないですが、面倒なので私なら、
character*10 filename
write(filename,'("file",I2.2,".txt")') niter
open(10,file=filename)
としちゃいます。

Qエ○画像を「いらない」と判断して削除する基準は?

僕はハードディスクの全容量30GBのうち、
半分の15GBがエロ画像のために使われている駄目男なんですが(笑)
そろそろハードディスクがいっぱいになるのでファイルの整理をしたいと思っています。
ただ、他の人達がどういう風に整理しているのか気になります。
CD-RWがあるのでCDを焼くのは簡単です。
でも、もくもくとコピーしていったらCD一枚700MBとしても単純計算で22枚CD-Rが必要です。
CD-Rは安いとはいえ、無料じゃないですからねぇ。
中には「こんなの使えねぇや(何に?)」ってのも結構あるし、ダブっているのもあります。
気付いたときになるべく消せばいいんですが、すぐスキップしちゃうんですよね、
なにせ気付いた瞬間はいつも右手が忙しいもんで(笑)
そこで質問です。

エロ画像を「いらない」と判断して削除する基準はどこですか?
今は使えなくても将来使えるかも、とたまに思うことがありますよね?
ないですか?
経験者の方、専門家の方(エロ画像収集家?)、お願いします。

Aベストアンサー

まず判断基準として、その画像の入手困難度ではないでしょうか?いわゆるレア度ですね。
再入手可能な画像はココで破棄します!!
その次に自分のお気に入り度によって判断しましょう。
それでも減らないようでしたら#1さんのアドバイスを参考に

QFortran90/Fortran95→Fortran77

大学の授業でFortranを使ったプログラミングを勉強しています。

以下の文が大学のPCに入っているコンパイラでは問題なくコンパイルでき実行できるのですが、家のPCだとコンパイルすることが出来ません(以下の文でエラーが出ます)
大学のPCの開発環境はFujitsu-FORTRANだと思います(^ ^;
家のPCはSalford FTN77 Personal Edition CompilerとCPad for Salford FTN77を組み合わせて使用しています

なぜエラーがでるのか自分なりに考えた結果、Fortran90/Fortran95のプログラムをFortran77のコンパイラでコンパイルしているからだと思います(全くの勘違いだったら指摘して下さい)

Fortran90/Fortran95の開発環境がフリーで整えばいいのですが、見つからないのでプログラムを修正したいと思います そこで、力を貸していただきたいのです

前置きが長くなりましたが、エラーが出る文は以下のところです
open(8,file='freq_ex13.dat',action='write',status='replace')
ここを、Fortran77のコンパイラでコンパイルできるようにアドバイスを下さい よろしくお願いします

大学の授業でFortranを使ったプログラミングを勉強しています。

以下の文が大学のPCに入っているコンパイラでは問題なくコンパイルでき実行できるのですが、家のPCだとコンパイルすることが出来ません(以下の文でエラーが出ます)
大学のPCの開発環境はFujitsu-FORTRANだと思います(^ ^;
家のPCはSalford FTN77 Personal Edition CompilerとCPad for Salford FTN77を組み合わせて使用しています

なぜエラーがでるのか自分なりに考えた結果、Fortran90/Fortran95のプログラムをFortran77のコンパイラでコン...続きを読む

Aベストアンサー

action='write'を削除してみては?
8番にREADを使わなければいいだけの話です。
http://docs.hp.com/ja/B3908-90007/ch10s65.html#id21163286

Fortranはコンパイラ毎に独自の拡張が相当されてますから、移植する際にはどの拡張が使えるのか把握する必要があります。
使えない場合はコンパイルエラーが返ってくるのですぐにわかりますけど。
http://www.cc.nao.ac.jp/vppman/HTML/japan/langFort/fvp11/fvp00079.htm

参考URL:http://docs.hp.com/ja/B3908-90007/ch10s65.html#id21163286

Qチェックディジットについてです。画像ですみませんm(__)mチェックディジットの計算がよくわか

チェックディジットについてです。
画像ですみませんm(__)m

チェックディジットの計算がよくわかりません 答えの言い方だと 最終的に出てきた一桁を末尾につけるだけなので ア〜エ全部できると思うのですが
なぜ エなのでしょうか?

Aベストアンサー

計算すると
アは、
ルール1: 1+2+3+4+5+6+7+8+9 = 45
ルール2: 4+5 =9
ルール3: チェックデジットは9
で、チェックデジットを付加した数字は、1234567899とならなければならない。
故に正しくない。

イは、
ルール1: 4+4+4+4+4+4+4+4+4 = 36
ルール2: 3+6 =9
ルール3: チェックデジットは9
で、チェックデジットを付加した数字は、4444444449とならなければならない。
故に正しくない。

ウは、
ルール1: 5+5+4+4+3+3+2+2+1 = 29
ルール2: 2+9 =11、1+1=2
ルール3: チェックデジットは2
で、チェックデジットを付加した数字は、5544332212とならなければならない。
故に正しくない。

残る「エ」が正しい。

恐らく質問者さんはチェックデジットの計算について思い違いをしているのではないかと思います。
「ア~エ」全部できると思った計算式を、補足いただければどこを直せばいいのか再回答できると思います。

QRGB値をL*a*b*に変換したい

VC++で画像処理のプログラムを組んでいます。
RGB値からL*a*b*への変換式はネット上にあるんですが、
実際コーディングして、出た値が正しいのかどうかを確かめるすべがないので困っています。
任意のRGB値を入力して、Lab値を取得する手段はないでしょうか?
ちなみに私の研究室にはフォトショとイラレはあります。
このへんのツールを使うとできたりするんでしょうか?

Aベストアンサー

バージョンによるかもしれませんが、フィトショのカラーピッカー(描画色をクリックすると出るやつ)にLabが表示されているので、RGBを入力すればLabの値が得られます。
なんらかの補正がかかっているかどうかは良くわかりません。

Qアルゴリズムとデータ構造についてこの画像の問題がよくわかりませんウが答えみたいなのですが なぜウ

アルゴリズムとデータ構造について
この画像の問題がよくわかりません
ウが答えみたいなのですが なぜウが出力できないのでしょうか?
ウもエと同じように
X②→Y②→Z①→Y③→X③
のようにできないのでしょうか?

Aベストアンサー

②の操作でデータを積み上げ、③の操作で積み上げた一番上のデータを出すので、
X、Yの順で(Xが下、Yが上で)積み上げたデータはY、Xの順でしか出せません。
よって、エが可能でウが不可能となります。
スタックのイメージを「縦にデータを積み上げる」図で考えてみてください。

QCOBOL 9(02)で定義した変数にマイナス値をセットすると?

COBOLについて教えてください。

現在、既存のシステム(COBOL)を机上でチェックしているのですが、
関数からの戻り値変数を (例)RC 9(02) で定義して、
異常発生時に、MOVE -1 で値セットしているロジックがありました。
S9タイプではないので、誤動作を起こすと思うのですが、
実際このような処理を行うと、変数RCにはどんな値がセットされるのでしょうか?
実行環境が無いので、動作確認ができず、困っています。(バグかと思うのですが、該当のロジックは幸いにも今まで実行されていなかったようです)
よろしくお願いします。

Aベストアンサー

コンパイラのメーカーや項目のデータタイプによって保持する
データの形式は異なります。

何れにしても、RCが-1かと聞いても否と言う結果になります。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報