【问题标题】:Fortran 95: Conversion from 8 digit integer to real ends in even real numberFortran 95:从 8 位整数到实数的转换以偶实数结束
【发布时间】:2017-01-01 16:56:46
【问题描述】:

我尝试了几个小时来转换一个整数,比如 33333333 使用内部函数 real(int) 转换为一个实数。我最终得到的只是最接近的偶数,有时是 33333332 或 33333334。使用小于 8 位的整数一切正常。一些以 1 开头的 8 位数字也可以,但从 20000001 开始我得到一个错误的实数...

有什么建议吗?

我的系统:ubuntu 14.04 LTS 和 gcc 4.8.4

【问题讨论】:

  • 你能显示你的代码/提供minimal reproducible example吗?
  • 您的实数模型不能准确地表示所有整数。对于有人提供一个很好的解释,了解您的浮点知识水平会有所帮助。
  • 33333333 不能用 IEEE 754 单精度浮点表示。
  • 感谢您的 cmets,下面的示例说明了我的意思...

标签: integer fortran


【解决方案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 位。

【讨论】:

  • 好的,感谢您提供一个简单的示例来说明我的问题。在我检查/思考种类/双精度问题之前,但这篇文章:stackoverflow.com/a/2391837/4267374 让我认为种类 4 就足够了
  • 请限制自己使用符合标准的代码。 real*n 不是有效的 Fortran,并且从未成为任何 ISO Fortran 标准的一部分。
  • @jlokimlin,由于大多数(如果不是全部)fortran 编译器接受 *lenght 表示法,很容易在互联网上找到这种表示法,这不是这个问题的真正关注点,不存在在 Stack Overflow 中规定我们必须“符合”任何类型的标准代码,最重要的是,因为我特别喜欢这种特定的符号,所以我会限制自己听从你的建议。感谢您的宝贵时间。
猜你喜欢
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多