FORTRANで
REAL(8) の変数に REAL(4)の変数の値を代入して値が変わらないようにすることが可能なのかをご教示頂きたいです。
REAL(8)はVsualStudioのウォッチで見てみた時の型で、宣言はdouble precisionです。
REAL(4)もウォッチで見た際のもので、
宣言はDIMENSIONです。
発生している問題・エラーメッセージ
小数点で誤差が出ます。
変数A:REAL(8) = 変数B:REAL(4)
↑この時点で7.9901などの値が7.89908のように変わってしまう。
変数A:REAL(8) = 変数A:REAL(8) / 変数C:REAL(4)
該当のソースコード
現在正確なものが提示出来ないので、
後ほど記載します。
上記のものと大きくは変わりません。
補足
DIMENSIONの宣言を合わせる事も検討しましたが、多数その宣言があり影響が大きいと考えそれ以外の方法があるか探しています。
ググってみてメモリの問題というものも出てきましたが、4byteから8byteへの代入なので先頭アドレスの問題ではないと思っているのですが・・・、勉強不足で確信が持てていない状態です。(帰宅したら参考サイトを追記します)
Fortrunも初めて触れるレベルで、ネットのドキュメントも少なく、自身の力不足も重なって行き詰まってしまいました。
何か情報の不足や至らない点があれば御指摘頂けますと幸いです。
よろしくお願い致します。
参考サイト
先頭メモリアドレスについての参考サイト
型についての参考サイト
【追記(1)】
こちらのサイトを参考に、
小数点部分に誤差が出る可能性があることはなんとなくイメージできたのですが
代入時に桁数が違うもの(メモリのbyte数が違うもの)に変換しているため、変換前の値と異なることははあり得る。
という理解であっているでしょうか・・・?
ですが4byteから8byteと領域が増えていてもそれは起きるもの・・?
【追記(2)】
原因として、
倍精度実数から単精度実数への代入を行っているので丸め誤差が発生している。
解決方法として、以下のものがある。
・有効桁数を増やす。(両方Doubleにする。= 型を合わせる。)
・直接計算を行って精度の高い計算を行った後、REAL(4)に丸める or 有効桁数で切り捨てる。
しかし今回のケースで、許容可能な誤差範囲が小数点7桁の丸めを許容しないので以上の二つは有効な手段にならない。
なので、
FORTRANで
REAL(8) の変数に REAL(4)の変数の値を代入して値が変わらないようにすることが可能なのかをご教示頂きたいです。
の内容は現在の演算方法では有効桁数を超える限り実現できない。
ご回答いただいた内容の通りでした。
回答1件
あなたの回答
tips
プレビュー