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

  • Se, että ' pitää paikkansa, tämän pitäisi olla vakiomenetelmä.
  • Ja kuinka usein ihmisten on todella muutettava ohjelmiensa tarkkuutta sokeasti menemättä joka tapauksessa menettelyyn ja testaukseen? Tärkein syy _dp -järjestelmän käyttöön on, että tarkkuus on selvästi määritelty kannettavalla tavalla.

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.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *