Неявное реальное преобразование в целое число в (IBM)-Fortran-IV

Я переписываю старую программу IBM-Fortran на современный Fortran-90 и столкнулся со следующими выражениями:

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

Насколько я знаю, в старом способе неявного объявления Фортрана переменные, начинающиеся с I-N, воспринимаются как целые числа. Это означает, что мы рассматриваем неявное преобразование чисел с плавающей запятой A,B в целые числа N1-N3.

Теперь мой вопрос: как мне перевести эти выражения, используя явные преобразования вещественных чисел в целые числа? Моя попытка была:

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

Кто-нибудь может прояснить это? Подсказок по этому поводу в инете не нашел.

Спасибо!


person Jost    schedule 19.09.2012    source источник


Ответы (1)


Встроенная функция преобразования типа "int" изменяет значения так же, как это делает присваивание целому числу.

P.S. Хотя неявная типизация все еще поддерживается, я считаю ее «старой». Этого лучше избегать - используйте "неявный none".

person M. S. B.    schedule 19.09.2012
comment
Честно говоря, я не уверен, что int() приводит к правильным результатам при использовании более высокой точности с плавающей запятой, то есть double precision переменных. Я думаю, что приведенный выше код играет с тем фактом, что числа с плавающей запятой имели ограниченную точность, я думаю, 1. +- 1E-4, что привело меня к предположению, что предполагалось поведение типа floor() или ceiling(). - person Jost; 19.09.2012
comment
Конечно, это устаревший способ кодирования, но неявное объявление в соответствии с первой буквой переменной все еще является допустимым кодом, что заставило меня вычеркнуть этот старый. - person Jost; 19.09.2012
comment
Нет, неявное преобразование идентично int. Это общая функция для всех действительных и других числовых типов, как и другие функции. - person Vladimir F; 19.09.2012
comment
Да, я знаю. При использовании неявного преобразования числа после точки просто обрезаются, что и делает int. Но опять же, какой смысл в +1.E-5 и -1.E-5? - person Jost; 19.09.2012
comment
@Jost, поскольку точность с плавающей запятой ограничена, возможно, какое-то число, например 3.0, хранится внутри, например, 2.99999987 или что-то в этом роде. Целочисленное усечение приведет к значению 2 вместо 3. Вот почему добавлена ​​небольшая поправка, просто чтобы поднять некоторые из наименее значащих битов мантиссы. (Примечание: этот пример очень плохой, поскольку 3.0 точно представляется в IEEE 754 как 1.1_2 x 2 ^ 1, но все же показывает общую идею). - person Hristo Iliev; 19.09.2012
comment
Я должен сказать, что случаи N1 и N3 имеют смысл, если в пределах до целого числа округлить до этого целого числа. Для N2 это говорит, что если мы являемся целым числом в пределах 1e-5, то округляем до следующего целого числа? Я бы изучил код, чтобы увидеть, действительно ли это намерение, если, конечно, ваша работа не состоит в том, чтобы портировать его, а также ошибки и все такое. - person agentp; 19.09.2012
comment
Если существующий код проверен длительным использованием, зачем его менять? Потолок и пол более элегантны, чем использование констант коррекции, но каждый раз, когда вы меняете большой унаследованный код, вы рискуете внести ошибку. Вот почему я склонялся к тому, чтобы использовать int без изменения вычислений — вы получите точно такой же результат. Использование int может подавить предупреждающие сообщения, в зависимости от компилятора и выбранных вами параметров. У вас есть набор регрессионных тестов? - person M. S. B.; 20.09.2012
comment
Я поддерживаю этот ответ :-) -- Хотя (насколько мне известно) большинство программистов не беспокоятся о неявном преобразовании типов. Они беспокоятся о неявном типе declaration (это то, чего вы избегаете, используя Implicit None). Я бы сказал, просто объявите переменные как real :: A,B и покончим с этим... - person mgilson; 20.09.2012