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.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *