獲得+ -inf在64位系統上,我用下一個代碼gfortran:爲什麼「-posinf」導致算術溢出?
double precision, parameter :: pinf = transfer(z'7FF0000000000000',1d0) ! 64 bit
double precision, parameter :: ninf = transfer(z'FFF0000000000000',1d0) ! 64 bit
,而且運作良好。
在32位 我有一個編譯錯誤,只爲NINF(!):
double precision, parameter :: ninf = transfer(z'FFF0000000000000',1d0
1
Error: Integer too big for integer kind 8 at (1)
分配ninf = -pinf
不是幫助,並導致編譯算術溢出錯誤:
double precision, parameter :: ninf = -pinf
1
Error: Arithmetic overflow at (1)
我瞭解ieee_arithmetic模塊,但gcc不處理它。
是否有任何多架構方式將常量設置爲正/負無窮?
更新 Gfortran選項-fno-range-check
抑制錯誤併成功編譯該代碼。
這並不重要,但我仍然很有趣。 爲什麼gfortran允許+ Infinity的恆定定義,但大聲喊叫與-Infinity完全相同的東西?因爲你是我沒有使用相同的編譯器
謝謝,它變得更加清晰。我真的認爲沒有辦法通過Fortran標準來完成「乾淨」的工作。這隻帶有十六進制常數的膠帶只是因爲gfortran中支撐ieee-754的泄漏。它一定是hacky。 – Sergei
我用過的其他Fortran編譯器(Cray,IBM,Intel,NAG,PGI)都有'IEEE_ARITHMETIC'模塊,這使得在運行時更容易設置Infinity或NaN。但是,該模塊中的幾乎所有內容在運行時只有*可用*,因此如果不使用十六進制文字,您仍然無法設置「參數」常量。 –