Recent, am întâmpinat o problemă bizară cu FORTRAN95. Am inițializat variabilele X și Y după cum urmează:
X=1.0 Y=0.1
Ulterior le adaug împreună și imprim rezultatul:
1.10000000149012
După examinarea variabilelor, se pare că 0.1 nu este reprezentat în dublă precizie cu acuratețe deplină. Există vreo modalitate de a evita acest lucru?
Răspuns
Un alt mod de a face acest lucru este mai întâi să specificați în mod explicit precizia pe care o doriți în variabilă utilizând intrinsecul SELECTED_REAL_KIND și apoi utilizați acest lucru pentru a defini și inițializa variabilele. :
INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15) REAL(dp) :: x x = 1.0_dp
Un avantaj frumos pentru a face acest lucru este că puteți stoca definiția dp
modul, apoi USE
acel modul acolo unde este necesar. Acum, dacă vreți vreodată să modificați precizia din programul dvs., trebuie doar să modificați definiția dp
în acel loc în loc să căutați și să înlocuiți toate D0
la sfârșitul inițializărilor variabile. (Acesta este și motivul pentru care aș recomanda să nu folosiți sintaxa 1.0D-1
pentru a defini Y așa cum este sugerat. Funcționează, dar face mai dificilă găsirea și schimbarea tuturor instanțelor în viitor.)
Această pagină de pe Fortran Wiki oferă câteva informații suplimentare bune despre SELECTED_REAL_KIND
.
Comentarii
- Așa este ', aceasta ar trebui să fie abordarea standard.
- Și cât de des trebuie oamenii să schimbe cu adevărat precizia programelor lor orbește, fără a merge oricum procedură cu procedură și testare? definit într-un mod portabil.
Răspuns
Ați declarat variabilele drept precizie dublă, dar le-ați inițializat cu valori de precizie unice.
Ați fi putut scrie:
X=1.0d0 Y=1.0d-1
Barron „s raspunde mai jos este un alt mod de a face o dublă precizie literală, cu avantajul că vă permite să modificați precizia variabilelor dvs. ulterior.
Comentarii
- Cred că ar trebui să se utilizeze metoda 1.0_dp descrisă în postarea de mai jos.
- I second @ OndřejČert í k ' s comentariu – Răspunsul lui Barron ' este cel mai bun.