Точность результатов умножения чисел на Fortran Visual Studio 2013

В Visual Studio 2013 создано два проекта: первый для одного ядра, второй - с использованием инструкций OpenMP для четырех ядер. Решается одна и та же задача (все входные данные идентичны). Результаты отличаются. При проверке выяснилось, что для проектов разная точность результатов умножения. В нераспараллеленную часть кода передаются две переменные, которые нужно умножить.

print*,CT1,TA(I,J,K),(CT1 * TA(I,J,K))
результат на одном ядре:  -3,5е-6    12,89648   -4,5137684е-5
результат на 4-х ядрах:   -3,5е-6    12,89648   -4,5137665е-5

Умножение на Python

a=-3.5e-6
b=12.89648
c=a*b
print("{:.10e}".format(c))
-4.5137680000e-05

Переменные объявлены одинаково, настройки студии одинаковы. Floating point model установлена precise. Изменение этих настроек не помогает. Подскажите пожалуйста в чем может быть проблема.


Ответы (1 шт):

Автор решения: Serge3leo

В качестве капитана Очевидность можно отметить, что различия, в некотором смысле, составляют единицу последнего разряда (например, в одном случае, результата, в другом случае, входных данных):

  program t
    implicit none
    real*4 r4, a, b
    integer*4 i4
    equivalence (r4, i4)

    a = -3.5e-6
    b = 12.89648
    r4 = a*b
    print '(z8,es15.7)', i4, r4
    r4 = r4*(1.e0 + epsilon(1.e0))
    print '(z8,es15.7)', i4, r4
    a = a*(1.e0 - epsilon(1.e0))
    b = b*(1.e0 - epsilon(1.e0))
    r4 = a*b
    print '(z8,es15.7)', i4, r4
  end program t

Получает все ваши числа:

B83D5237 -4.5137680E-05
B83D5238 -4.5137684E-05
B83D5233 -4.5137665E-05
→ Ссылка