За счет ограниченной точности при приведении аргумента к промежутку, на котором выполняется вычисление (Argument reduction). На шаге масштабирования результата для приведенного аргумента малые погрешности значительно увеличиваются. См. методы вычисления триг. функций, напрмер в книге Ильин, Позняк "Основы математического анализа", Т1.
Но и исходные константы заданы с малой точностью. Если же надо любой ценой выполнить вычисления с большой точностью, то можно воспользоваться символьными вычислениями.
Код:
>> x=1:2; y=1:2;
>> [X,Y] = meshgrid(x,y);
>> lym = sym('500*10^(-9)');
>> e0 = sym('8.854*10^(-12)');
>> w = 2*sym('Pi')*299792458/lym;
>> m0= sym('1.256*10^(-6)');
>> k=sqrt(w^2*e0*m0)
>> Z = sym(X.^2+Y.^2);
>> R = sqrt(Z);
>> vpa(exp(i*R*k))
ans =
[ .82143878128081838467134437365322+.57029670225934483808416349034038*i, .30763122899377922032278553979388-.95150566311913087383309065611916*i]
[ .30763122899377922032278553979388-.95150566311913087383309065611916*i, .34952334278423236850499169896615+.93692765614477193673272261370513*i]
Для значения Digits по умолчанию (32). Можно значение Digits увеличить.
-- Вс 31.01.2016 17:12:57 --Забыл символьно вычислить R. Поэтому результат неверен. Сейчас переделаю.
Upd. Пересчитал. Исправил.