Любая платформа, где Fortran `двойная точность` отличается от C` double`? - PullRequest
1 голос
/ 22 марта 2019

Для обеспечения совместимости с программами на Си в редакции 2003 года стандарта Fortran введен модуль iso_c_binding, который позволяет писать такие вещи:

USE iso_c_binding, ONLY: c_int, c_float
INTEGER(KIND=c_int) :: x
REAL(KIND=c_float) :: y

, который гарантированно отображается точно на int x и float y на С-стороне.Теперь для целых чисел это крайне важно, поскольку тип INTEGER по умолчанию может (в зависимости от компилятора и платформы) очень хорошо переноситься на 64-битный целочисленный тип, даже если int является 32-битным.

Однако,для типов с плавающей запятой следующие отображения кажутся почти неизбежными:

REAL*4  (or)  REAL               ->  float
REAL*8  (or)  DOUBLE PRECISION   ->  double

Так вот вопрос: есть ли практическая платформа или компилятор, где это не удовлетворено, например, где sizeof(REAL*4) != sizeof(float)

Ответы [ 2 ]

6 голосов
/ 22 марта 2019

Рассмотрим gfortran, у которого есть опции времени компиляции -freal-4-real-8, -freal-8-real-16 и т. Д. Они изменяют размер вещественного числа Фортрана, включая те, которые объявлены с нестандартным real*4.

Рассмотрим также ifort:

  use, intrinsic :: iso_c_binding
  print*, C_SIZEOF(0._c_double).eq.C_SIZEOF(0d0)
end program

скомпилировано с / без -double-size 128 Я вижу F / T.

Конечно, как прокомментировал Владимир Ф., даже если исключить размер типов, есть еще что-то, что необходимо учитывать с точки зрения взаимодействия. На самом деле желательно использовать real(c_double) ... для получения совместимого реального.

2 голосов
/ 22 марта 2019

Зависит от вашей идеи "практического компилятора", наверное.

Ни стандарт C, ни стандарт Fortran не требуют соответствия IEEE, но большинство компиляторов [необходимо для цитирования] придерживаются его (как и большинство процессоров, так что это вопрос оптимизации так же, как и соответствия).Процессоры Cray и VAX являются заметными исключениями, поэтому вы можете найти компилятор для тех систем, который соответствует реализации процессора с плавающей точкой.(например, на Cray, число с плавающей запятой составляет 8 байт).

Для более: http://www.quadibloc.com/comp/cp0201.htm

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