2015-08-14 7 views
0

Я работаю с большим Fortran кода, который использует XLF компилятор для POWER7 Он использует эти флаги, чтобы установить точность до 64 бит: -qrealsize=8 -qintsize=8Mixed точность присваивание

Однако недавно импортировала кусок кода имеет линии, подобные этим:

real :: var1d(nvol) 
real :: var3d(ni,nj,nk) 

var1d = var3d*1.0e6 

Интересно, как XLF имеет дело с буквальным 1e6? Основная проблема: это где эталонная версия и модифицированная версия отклоняются. 9-я и 10-я значащие цифры отличаются для var1d.

Настойчиво это растет с итерациями.

+0

Все реальные переменные и константы должны продвигаться флагом. У меня нет времени изучать руководство XLF (вы должны это сделать!), Но нормальные же компиляторы делают это. –

+1

Если бы я был обеспокоен этой проблемой, я бы, вероятно, переписал литерал как «1.0d6» (или «1.0_real64» или какой-то эквивалент) и посмотрел, какое влияние это имеет. Конечно, вы, вероятно, скажете мне, что отклонения начинаются только после 100 000 вычислительных часов. –

+2

Чтобы добавить к другим комментариям, '1e6' - это буквальная реальная константа типа по умолчанию. – francescalus

ответ

0
Data Object  REALSIZE(4) in Effect  REALSIZE(8) in Effect 
------------------------------------------------------------------- 
1.2    REAL(4)      REAL(8) 
1.2e0    REAL(4)      REAL(8) 
1.2d0    REAL(8)      REAL(16) 
1.2q0    REAL(16)      REAL(16) 

REAL    REAL(4)      REAL(8) 
DOUBLE PRECISION REAL(8)      REAL(16) 
COMPLEX   COMPLEX(4)     COMPLEX(8) 
DOUBLE COMPLEX COMPLEX(8)     COMPLEX(16) 

Как указано в руководстве по эксплуатации XLF on-line. Спасибо за все полезные предложения. Поэтому я должен подтвердить, что это не источник расхождения.