Fortran 函式中單精度,雙精度不匹配的錯誤

2021-07-12 01:20:19 字數 1423 閱讀 4497

錯誤例項01:

program subroutine

real*4 arr

arr=1.1

call fun1(arr)

endsubroutine fun1(arr)

real*8 arr

write

(*,*) arr

end

情況下

主程式定義了乙個 單精度的變數 arr ,賦值為1.1,

子函式的變數型別是雙精度。

列印結果是

[root@localhost subroutine]# ./a.out

-1.39490411823145607e+195

[root@localhost subroutine]#

說明 嘗試用 雙精度的方式 去解釋單精度時候, 會出現嚴重的錯誤。

經過測試 ,反過來, 用單精度的方式去解釋 雙精度時 ,也會發生這樣的錯誤 。

結論。只有 兩邊的精度匹配時,才能得到預期的效果。

要麼都是雙精度。

要麼都是單精度。

情況2

如果用 數字的情況下, 要用什麼型別來 處理呢?

經測試, 如果是 1.1 這樣的字面值, 就是單精度, 用 real*4 就可以。 real*8 就不行。

如果需要雙精度 的字面值,要寫成 1.1d0 ,這樣用real*8 就可以。

參考情況3

如果,就要需要乙個單精度的數字,而輸入偏偏是雙精度 ,那怎麼辦呢?

program subroutine

call fun1(1.1d0)

endsubroutine fun1(tmp)

real*8 tmp

real*4 arr

write

(*,*) tmp

arr=tmp

write

(*,*) arr

end

應該像這個例子,先用相同的精度,把數字接過來, 再進行賦值。

例子3

program test

real,external:: add

// 應該顯示宣告為 real*8

real*8 arr

arr = add(1.1)

write

(*,*) arr

endreal*8

function

add(t)

real

tadd=1.1

return

end

例子3 的輸出也是錯的。因為函式返回型別是 real*8,

但是在 主程式中, 宣告的時候,是real, 並沒有標明是real*8 ,在我的機器上,

real 和 real*4 的乙個意思 ,所以也會出錯。

雙精度,單精度和半精度

浮點數是計算機上最常用的資料型別之一,有些語言甚至數值只有浮點型 perl,lua同學別跑,說的就是你 常用的浮點數有雙精度和單精度。除此之外,還有一種叫半精度的東東。雙精度64位,單精度32位,半精度自然是16位了。半精度是英偉達在2002年搞出來的,雙精度和單精度是為了計算,而半精度更多是為了降...

關於單精度 雙精度的概念

單精度和雙精度數值型別最早出現在c語言中 比較通用的語言裡面 在c語言中單精度型別稱為浮點型別 float 顧名思義是通過浮動小數點來實現資料的儲存。這兩個資料型別最早是為了科學計算而產生的,他能夠給科學計算提供足夠高的精度來儲存對於精度要求比較高的數值。但是與此同時,他也完全符合科學計算中對於數值...

什麼叫單精度浮點型?什麼叫雙精度浮點型?

引用一寫道 單精度浮點型 float 專指占用32位儲存空間的單精度 single precision 值。單精度在一些處理器上比雙精度更快而且只占用雙精度一半的空間,但是當值很大或很小的時候,它將變得不精確。當你需要小數部分並且對精度的要求不高時,單精度浮點型的變數是有用的。例如,當表示美元和分時...