Об утверждении Selected_int_kind - PullRequest
0 голосов
/ 10 апреля 2019

После изучения этого веб-сайта (http://www.mathcs.emory.edu/~cheung/Courses/561/Syllabus/6-Fortran/kind.html) об операторах selected_int_kind и selected_real_kind в Фортране у меня возник этот вопрос при наборе этого кода:

program large_integers

  integer, parameter :: Single = selected_int_kind(precision(1.e0)) 
  integer, parameter :: Double = selected_int_kind(precision(1.d0))
  integer(Single), parameter :: sNaN    = Z"7FC0000"

  integer (single) a
  real(single) b
  integer (double) c
  real(double) d

  write(*,*) 'a = ', a, 'b = ',b , 'c = ' , c, 'd= ', d , sNaN

end program large_integers    

После запуска он дал мне такой результат:

a = 1 b = -4,78538941E-39 c = 4294954096 d = 3,1846750471760586E-314 133955584

Прежде всего, точность не определена для selected_int_kind, но только для selected_real_kind, но здесь это было.

Во-вторых, как можно получить реальное значение для b и d, если одинарные и двойные имеют целочисленный тип?

В-третьих, как работает, что sNaN содержит символ, пока он определяется как целое число?

Извините, если мой вопрос показался глупым. Спасибо за вашу помощь.

1 Ответ

1 голос
/ 10 апреля 2019

Позвольте мне попытаться объяснить, и я надеюсь, что я рассмотрю все вопросы, которые вы поднимаете ...

У всех скаляров Фортрана есть kind, который определяет диапазон и точность, которые принимают переменные такого рода.Все текущие компиляторы, с которыми я знаком, (обратите внимание, что последующие операторы не обязательно применяются ко всем прошлым или будущим компиляторам Фортрана) определяют как минимум 2 вида как для вещественных, так и для целочисленных переменных.Если вы хотите думать об этих видах как о разном количестве битов в представлении чисел, вы не ошибетесь, хотя стандарт Фортрана немного расплывчат в том, как именно должны быть представлены числа, оставляя большую часть деталей дляавторы компиляторов и концентрирующиеся на интерпретации программ.

Логические, символьные и комплексные переменные также бывают разных видов, но мы пока оставим их в стороне.

Внутренние процедуры selected_int_kindи selected_real_kind возвращает целочисленное значение, выражающее «код» конкретного компилятора для целого (действительного) такого рода.Многие компиляторы, хотя и не все, используют такие коды, как 4 и 8 для, соответственно, 32- и 64-битных целых чисел (вещественных чисел) - но не зацикливаются на соответствии, добрые «коды» произвольны ипо крайней мере, один текущий компилятор использует вместо них 2 и 3.Используя подпрограммы selected_n_kind, ваш код не зависит от платформы, вы никогда не используете эти коды явно.

Мне кажется странным использовать precision с реальным аргументом, как вы это делали ввызовы selected_int_kind, чаще я ожидал увидеть целочисленные литеральные аргументы.Вызов, такой как selected_int_kind(n), возвращает код вида для целых чисел с диапазоном -10^n .. 10^n или -1, если такого целого числа нет.

Как это бывает, и вам повезло, большинство современных компиляторов используютКоды одного и того же типа для целых чисел и вещественных чисел с одинаковым количеством битов, так что вы можете использовать selected_int_kind для получения кодов для обоих, это не обязательно верно, и лучший способ получить реальные виды будет использовать selected_real_kind.

В эти дни вы также можете использовать некоторые заранее определенные константы.Внутренний модуль iso_fortran_env объявляет такие константы, как real32 и int64, которые задают коды вида, и вы можете просто use их.Если из-за этого вы немного почесываете голову, посмотрите некоторые вопросы и ответы здесь на SO, которые уже охватывают этот вопрос.

Я не уверен, что полностью понимаю вопрос, подразумеваемый в вашем предложении все ... .Как я писал выше, большинство современных компиляторов используют одинаковые коды типов для вещественных чисел и целых чисел.Лучше не думать о целых числах, имеющих точность, все целые числа являются абсолютно точными эквивалентами «действительным» целым числам, целочисленные переменные имеют ограниченный диапазон.Вещественные числа, с другой стороны, имеют точность, большинство компиляторов Фортрана в настоящее время следуют IEEE754 для спецификации точности и диапазона для действительных значений.

Second ... - вы заявилиb и d имеют тип real, разумеется, они имеют действительные значения.

Третий ... - sNan является целым числом по объявлению.Термин Z"7FC0000" - это способ, которым Fortran использует шестнадцатеричные цифры для установки значения целого числа.(Вы также можете использовать b в качестве префикса для строки двоичных цифр, o для восьмеричного.) Я ожидаю, хотя я не проверял, что 133955584 является десятичным эквивалентом.

Наконец, вы не указали значения ни для одной из переменных, поэтому процессор интерпретирует найденные в памяти биты как переменную указанного типа и записывает их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...