2016-08-25 11 views
1

整数を変換しようとしていますが、組み込み関数real(int)を使用して33333333を実数とすることができます。私が終わるのは、最も近い偶数だけです。時には33333332または33333334になります.8桁未満の整数を使用するとすべて正常に動作します。 8桁の冒頭にある1つの数字も同様に動作しますが、20000001からは間違った結果が得られます。Fortran 95:偶数の実数で8桁の整数から実数への変換

何か提案がありますか?

私のシステム:Ubuntuの14.04 LTSとgcc 4.8.4

+1

コードを表示したり、[mcve]を提供できますか? –

+1

実数モデルは完全に整数を表すことはできません。誰かが良い説明を提供するためには、浮動小数点の知識のレベルを理解することが役に立ちます。 – francescalus

+2

33333333は、IEEE 754単精度浮動小数点では表現できません。 – talonmies

答えて

1

この単純なプログラムは、変換時に、二重対シングルを使用しての違いを示しています

program compare 
    implicit none 

    real*8 :: real_8_v 
    real*4 :: real_4_v 
    integer :: integer_v 

    integer_v = 33333333 
    real_4_v = real(integer_v, 4) 
    real_8_v = real(integer_v, 8) 

    write(*, '(E15.8)') real_4_v 
    write(*, '(E15.8)') real_8_v 
end program compare 

結果は次のようになります。

0.33333332E + 08 < =単精度

0.33333333E + 08 < =倍精度

これを支配するIEEE754では、単精度数値(32ビット)の「精度」は最大7桁にしかなりません。倍精度の数値(64ビット)を扱う場合は、最大15桁になります。

+0

大丈夫、私の問題を示す簡単な例を提供していただきありがとうございます。前に私が種類/倍精度の問題をチェック/思考していましたが、この投稿:http://stackoverflow.com/a/2391837/4267374私はその種が4で十分だと思ったのです – benni

+1

標準に準拠したコードに制限してください。 'real * n'は有効なFortranではなく、決してISO Fortran標準の一部ではありませんでした。 – jlokimlin

+0

@jlokimlin、Fortranコンパイラの大部分(すべてではないにしても)が* lenght表記を受け入れるので、インターネット上でこの表記法を見つけるのは非常に簡単で、この質問の真の関心事ではなく、既存のStack Overflowどのような種類の標準コードにも「適合」することができます。最も重要なのは、特にこの表記が好きなので、私は自分のアドバイスに従わないようにします。あなたの時間をありがとう。 – Jauch

関連する問題