2017-03-14 92 views
0

我在Fortran代碼中爲a=0.00001分配了一個實際變量。在打印下面的行上的變量時,給出a=9.9999997473787516E-006而不是1E-5避免爲fortran實變量聲明「_8」?

解決此問題的方法是聲明a=0.00001_8a=0.00001_rk,並使用rk定義值8

我想在編程時避免這種underscore風格。有沒有辦法做到這一點沒有下劃線的是CC++

+2

有辦法使用'0.00001'給像'0.0001_rk',但要真正回答這個問題_why_要避免使用(完全適合)的形式'0.0001_rk'將是有益的瞭解。我可以避免在我的程序中編寫'0'來代替編寫'1-1',但我懷疑有人會建議這樣做。 – francescalus

+1

基本上爲了更好的可讀性,我不想有任何後綴。有時代碼的長度會因多個地方的後綴而增加。有沒有辦法做到這一點,如在C或C + +,我們不使用任何後綴聲明的變量? –

+0

你應該努力讓你的代碼可維護和便攜。避免'_rk'表示法既不是那些東西。可讀性很重要,但在這種情況下是次要的。 – Ross

回答

1

您可以使用該指數d,而不是E:

a=0.00001d0 

,如果你的變量已經被聲明爲雙精度這是唯一有用的實(RK)王氏RK的定義爲:

integer,parameter :: rk=selected_real_kind(15,100) 

另外,不要用_8_rk_8不可移植)。

+1

如果類型值'rk'(或'8')與雙精度值相同,則爲真。 – francescalus

+0

@francescalus幾乎總是這樣......除非我很久以前使用Cray或CDC電腦! –

+1

我在一個小時前使用了一個編譯器,它會拒絕接受'1._8'。如果我問它,那個編譯器也可以接受'rk'作爲默認類型。 – francescalus

2

我會在這裏列出幾個選項,但最終答案是使用下劃線標記。特別是在開發新代碼時,所有實際變量都應使用kind參數。有幾個很好的許多方法來定義一種參數:

  • ISO_FORTRAN_ENV具有通過它們的大小定義實數和整數:REAL32REAL64INT32INT64,等等。
  • 使用內部函數SELECTED_REAL_KIND獲得一種具有指定的精度和指數範圍
  • IEEE_SELECTED_REAL_KIND爲IEEE兼容
  • ISO_C_BINDING包含C_DOUBLE和其他人對C的互操作性

這樣一來,就可以實現在任何機器上所需的精度。例如,

use ISO_FORTRAN_ENV, only : wp => REAL64 
real(wp) :: x 

重要的部分是要顯式聲明wp。然後,如果你想要使用X具有值0.1,您使用

x = 0.1_wp 

這是FORTRAN符號將其設置爲使用wp那種代表0.1。你不應該僅僅因爲你認爲它的可讀性不好就拒絕它。


但是,我將包括一些其他選項。他們雖然不是很好!使用d代替e,這要求double precision,例如x = 0.1d0

  • 使用編譯標誌更改默認實樣

    • 聲明常量。在gfortran中,您通常會使用-fdefault-real-8 -fdefault-double-8。這個編譯器選項並不總是存在的(當然不是完全相同的),也限制了你可以聲明的可能的真實類型。

  • +0

    以及來自iso_c_binding的c_double – tim18

    +0

    我已經將你的建議添加到body ,謝謝@francescalus和蒂姆 – Ross