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
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ší.
_dp
je, aby přesnost byla jasně definováno přenosným způsobem.