Viime aikoina olen kohdannut outon ongelman FORTRAN95: n kanssa. Alustin muuttujat X ja Y seuraavasti:
X=1.0 Y=0.1
Myöhemmin lisätään ne yhteen ja tulostan tuloksen:
1.10000000149012
Muuttujien tutkinnan jälkeen näyttää siltä, että 0,1 ei ole esitetty kaksoistarkkuudella täydellä tarkkuudella. Onko mitään keinoa välttää tämä?
Vastaa
Toinen tapa tehdä tämä on määritellä ensin nimenomaisesti haluamasi tarkkuus muuttujaan sisäisen SELECTED_REAL_KIND -ominaisuuden avulla ja käyttää tätä sitten muuttujien määrittelemiseen ja alustamiseen. :
INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15) REAL(dp) :: x x = 1.0_dp
Mukava etu tällä tavalla on, että voit tallentaa dp
-määrityksen moduuli, sitten USE
kyseinen moduuli tarvittaessa. Jos haluat joskus muuttaa tarkkuutta sinun on muutettava vain dp
määritelmää samassa paikassa sen sijaan, että etsitään ja korvaisit kaikkia D0
muuttujan alustusten loppu. (Siksi suosittelen myös, että 1.0D-1
-syntaksia ei käytetä määrittelemään Y ehdotetun mukaisesti. Se toimii, mutta vaikeuttaa kaikkien esiintymien löytämistä ja muuttamista tulevaisuudessa.)
Tällä Fortran-Wikin sivulla on hyviä lisätietoja aiheesta SELECTED_REAL_KIND
.
Kommentit
Vastaus
Ilmoitit muuttujat kaksoistarkkuuksiksi, mutta alustit ne yksittäiset tarkkuusarvot.
Voisit kirjoittaa:
X=1.0d0 Y=1.0d-1
Barron ”s vastaus alla on toinen tapa tehdä kirjaimellisesti kaksinkertainen tarkkuus, etuna, että sen avulla voit muuttaa muuttujien tarkkuutta myöhemmin.
Kommentit
- Luulen, että tulisi käyttää alla olevassa viestissä kuvattua 1.0_dp-menetelmää.
- Toistan @ OndřejČert í k ' s kommentti – Parron ' vastaus on paras.
_dp
-järjestelmän käyttöön on, että tarkkuus on selvästi määritelty kannettavalla tavalla.