teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

文言修正

2018/09/11 15:54

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -63,6 +63,6 @@
63
63
  > FORTRANで
64
64
  > REAL(8) の変数に REAL(4)の変数の値を代入して値が変わらないようにすることが可能なのかをご教示頂きたいです。
65
65
 
66
- の内容は現在の演算方法では不可能
66
+ の内容は現在の演算方法では有効桁数を超える限り実現できない
67
67
 
68
68
  ご回答いただいた内容の通りでした。

3

自己解決

2018/09/11 15:54

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -44,4 +44,25 @@
44
44
  代入時に桁数が違うもの(メモリのbyte数が違うもの)に変換しているため、変換前の値と異なることははあり得る。
45
45
 
46
46
  という理解であっているでしょうか・・・?
47
- ですが4byteから8byteと領域が増えていてもそれは起きるもの・・?
47
+ ですが4byteから8byteと領域が増えていてもそれは起きるもの・・?
48
+
49
+ 【追記(2)】
50
+ 原因として、
51
+ 倍精度実数から単精度実数への代入を行っているので丸め誤差が発生している。
52
+
53
+ 解決方法として、以下のものがある。
54
+ ・有効桁数を増やす。(両方Doubleにする。= 型を合わせる。)
55
+ ・直接計算を行って精度の高い計算を行った後、REAL(4)に丸める or 有効桁数で切り捨てる。
56
+
57
+ しかし今回のケースで、許容可能な誤差範囲が小数点7桁の丸めを許容しないので以上の二つは有効な手段にならない。
58
+
59
+ [参考にしたサイト1](https://dobon.net/vb/dotnet/beginner/floatingpointerror.html)
60
+ [参考にしたサイト2](http://www.cc.kyoto-su.ac.jp/~yamada/programming/float.html)
61
+
62
+ なので、
63
+ > FORTRANで
64
+ > REAL(8) の変数に REAL(4)の変数の値を代入して値が変わらないようにすることが可能なのかをご教示頂きたいです。
65
+
66
+ の内容は現在の演算方法では不可能。
67
+
68
+ ご回答いただいた内容の通りでした。

2

参考アドレスの追加。 回答していただいた内容についての追記を追加。

2018/09/11 15:50

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -34,4 +34,14 @@
34
34
  よろしくお願い致します。
35
35
 
36
36
  参考サイト
37
+ [先頭メモリアドレスについての参考サイト](http://cockscomb.info/bug_with_variable_type_in_fortran/)
37
- http://www.nag-j.co.jp/fortran/FI_4.html
38
+ [型についての参考サイト](http://www.nag-j.co.jp/fortran/FI_4.html)
39
+
40
+ 【追記(1)】
41
+ [こちらのサイト](https://qiita.com/Yachida/items/ed7df72063e52cc34887)を参考に、
42
+ 小数点部分に誤差が出る可能性があることはなんとなくイメージできたのですが
43
+
44
+ 代入時に桁数が違うもの(メモリのbyte数が違うもの)に変換しているため、変換前の値と異なることははあり得る。
45
+
46
+ という理解であっているでしょうか・・・?
47
+ ですが4byteから8byteと領域が増えていてもそれは起きるもの・・?

1

綴りを誤っていたのを修正。 Fortrun → FORTRAN

2018/09/11 14:48

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- Fortrunの型変換で値が変わる
1
+ FORTRANの型変換で値が変わる
body CHANGED
@@ -1,4 +1,4 @@
1
- Fortrun
1
+ FORTRAN
2
2
  REAL(8) の変数に REAL(4)の変数の値を代入して値が変わらないようにすることが可能なのかをご教示頂きたいです。
3
3
 
4
4
  REAL(8)はVsualStudioのウォッチで見てみた時の型で、宣言はdouble precisionです。