Nedávno jsem narazil na bizarní problém s FORTRAN95. Inicializoval jsem proměnné X a Y takto:

X=1.0 Y=0.1 

Později je přidám a vytisknu výsledek:

1.10000000149012 

Po prozkoumání proměnných zdá se, že 0,1 není znázorněna ve dvojité přesnosti s plnou přesností. Existuje nějaký způsob, jak se tomu vyhnout?

Odpovědět

Dalším způsobem, jak to udělat, je nejprve explicitně zadat požadovanou přesnost v proměnné pomocí SELECTED_REAL_KIND a poté pomocí ní definovat a inicializovat proměnné. Něco jako :

INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15) REAL(dp) :: x x = 1.0_dp 

Pěknou výhodou tohoto postupu je, že můžete definici dp uložit do modul, poté USE tento modul podle potřeby. Nyní, pokud chcete někdy změnit přesnost vašeho programu, musíte pouze změnit definici dp na jednom místě místo hledání a nahrazení všech D0 s na konec vašich inicializací proměnných. (To je také důvod, proč doporučuji nepoužívat 1.0D-1 syntaxi k definování Y, jak je navrženo. Funguje to, ale v budoucnu je těžší najít a změnit všechny instance.)

Tato stránka ve Fortran Wiki poskytuje několik dobrých doplňujících informací o SELECTED_REAL_KIND.

Komentáře

  • Správně, ' by to měl být standardní přístup.
  • A jak často lidé skutečně musí přesnost svých programů slepě měnit, aniž by museli postupovat procedurou po proceduře a testovat? Hlavním důvodem použití schématu _dp je, aby přesnost byla jasně definováno přenosným způsobem.

Odpověď

Proměnné jste deklarovali jako dvojitou přesnost, ale inicializovali jste je pomocí jednotlivé hodnoty přesnosti.

Mohli jste napsat:

X=1.0d0 Y=1.0d-1 

Barron odpověď níže je další způsob, jak vytvořit doslovnou dvojitou přesnost, s výhodou, že vám umožní změnit přesnost vašich proměnných později.

Komentáře

  • Myslím, že by se mělo používat metody 1.0_dp popsané v příspěvku níže.
  • I second @ OndřejČert í k ' s komentář – Barron ' odpověď je nejlepší.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *