Мне нужно перенести число с фортера на С ++, чтобы при чтении на с ++ он обрабатывался как numeric_limits :: quiet_nan (). Мы используем компиляторы Salford / Intel на стороне Fortran и VS2010 на C ++, используя общую память в Windows.
Есть идеи,
Джеймс
Стандарт Fortran 2003 определяет встроенный модуль ieee_arithmetic
который содержит, среди прочего, определения производного типа под названием ieee_class_type
, Этот же модуль также определяет группу именованных констант этого типа, имя одной из этих именованных констант: ieee_quiet_nan
,
ieee_arithmetic
также определяет функцию ieee_value
который принимает 2 аргумента; первый из них (назовите это x
реальный, а второй (называется class
) принимает значение типа ieee_class_type
такие как ieee_quiet_nan
поэтому вызов функции ieee_value(x,ieee_quiet_nan)
вернет IEEE тихий NaN того же типа и вида, что и x
,
Обратите внимание, что эта функция работает только если вызов функции ieee_support_nan(x)
возвращается .true.
, Процессоры Fortran не обязаны поддерживать все функции арифметики IEEE, и для мобильности всегда лучше сначала проверить, какие функции вы хотите использовать.
Поэтому я предполагаю, что если ваши программы на Фортране и С ++ совместно используют память, оператор Фортрана, такой как
y = ieee_value(x,ieee_quiet_nan)
поместит биты в место, указанное именем y
которую ваша C ++ программа поймет как тихий NaN.
РЕДАКТИРОВАТЬ
Если, как говорит нам Владимир Ф, в Фортране Солфорда нет ieee_arithmetic
Я полагаю, вам придется прибегнуть к услугам Фортрана. Объявите целочисленную переменную с количеством битов, которое вы хотите в C ++, выясните, каковы действительные битовые комбинации для тихого NaN, тогда это должен быть плоскостный переход.
Других решений пока нет …