【问题标题】:Implicit real conversion to integer in (IBM)-Fortran-IV(IBM)-Fortran-IV 中的隐式实数转换为整数
【发布时间】:2012-09-19 12:43:18
【问题描述】:

我正在将一个旧的 IBM-Fortran 程序重写为现代 Fortran-90,我遇到了以下表达式:

N1=A/B+1.000001
N2=A/B+1. -1.E-5
N3=A/B+1.E-05

据我所知,在old Fortran 的隐式声明方式中,以I-N 开头的变量被视为整数。这意味着我们正在研究从浮点数 A,B 到整数 N1-N3 的隐式转换。

我现在的问题是,如何使用显式实数转换来翻译这些表达式? 我的尝试是:

N1=ceiling(A/B+1.)
N2=floor(A/B+1.)
N3=ceiling(A/B)

谁能澄清一下?我没有在互联网上找到任何关于此的提示。

谢谢!

【问题讨论】:

    标签: floating-point integer fortran type-conversion fortran77


    【解决方案1】:

    类型转换内在函数“int”改变值就像赋值给整数一样。

    附:虽然仍然支持隐式类型,但我认为它“旧”。最好避免 - 使用“隐式无”。

    【讨论】:

    • 老实说,我不确定int() 在使用更高的浮点精度时是否会导致正确的结果,即double precision 变量。我认为上面的代码是在玩弄这样一个事实,即浮点数的准确度有限,我认为,1. +- 1E-4,这使我假设floor()ceiling() 的行为是有意的.
    • 当然,这是一种不推荐使用的编码方式,但是根据第一个变量字母的隐式声明仍然是有效的代码,这让我删除了那个old。跨度>
    • 不,隐式转换等同于int。它是一个通用函数,适用于所有实数类型和其他数字类型,其他函数也是如此。
    • 是的,我知道。使用隐式转换时,点后面的数字会被截断,这就是int 所做的。但话说回来,+1.E-5-1.E-5 的意义何在?
    • @Jost,由于浮点精度是有限的,可能像3.0 这样的数字在内部存储,如2.99999987 或其他东西。整数截断将导致值2 而不是3。这就是为什么添加一个小的修正,只是为了增加尾数的一些最低有效位。 (注意:这个例子很糟糕,因为 3.0 在 IEEE 754 中完全可以表示为 1.1_2 x 2^1 但仍然显示了一般想法)。
    猜你喜欢
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多