2017-08-11 8 views
1
program sum 
IMPLICIT DOUBLE PRECISION (A-H,O-Z) 
x = 1 
y = 2 
z = (x*y)/dtan(0.0D0) 
print *, z 
end program sum 

このコードをOnline Fortran Compilerとコンパイルすると、「無限大」が得られます。このコードを別の言語で書くと、0で割り切れません。なぜなら、何らかの理由でfortranに0.0D0 <> 0がなければtan(0)= 0なので意味があります。これは数学的に正しい方法を説明することができますか?

+0

@JohnColemanそれはあなたが質問から得たものですか?私はそれがどのように数学的に可能かを尋ねています... – LionsFan

+0

@JohnColemanありがとうございます。 – LionsFan

答えて

2

Fortranは、プログラムの期待される結果を直接記述するものではなく、結果はプロセッサの算術モデルに依存します。

IEEE演算が使用されていると仮定すると、3d0/0d0の評価はieee_divide_by_zeroフラグを通知します。分裂の結果が正の無限大であると合理的に期待できる。

例外フラグが立てられたときの動作は、コンパイラによって異なります。コンパイラは、そのようなフラグが通知されると、デフォルトに停止するか、または続行することがあります。コンパイラには、応答を変更するためのコンパイル時オプションもあります。

が(Fortran 2003の)プログラムを考えてみましょう:

use, intrinsic :: ieee_exceptions 
    implicit none 
    real(kind(0d0)) x 

    x=1 

    call ieee_set_halting_mode(ieee_divide_by_zero, .false.) 
    print *, x/0 

    call ieee_set_halting_mode(ieee_divide_by_zero, .true.) 
    print *, x/0 
end 

我々は、おそらく無限大の値を印刷し、停止していない部門を試みる初めて。 2回目です

+0

ニース、有益な答え。 –

+0

ありがとう、非常に有益です。 – LionsFan

関連する問題