?

Log in

No account? Create an account
светлое будущее
Mike Potanin potan
Previous Entry Share Flag Next Entry
Забавная арифметика.

Есть фунция на Julia
function pconcat(x,y,arc)
  xe = exp(x)
  xm = 1.0/xe
  ye = exp(y)
  ym = 1.0/ye
  c = cos(arc)

  xc = xe+xm
  xs = xe-xm
  yc = ye+ym
  ys = ye-ym

  l = (xc*yc + xs*ys*c)/4

  larc = (xc*l - yc)/(xs*(sqrt((l-1)*(l+1))))

  (acosh(l), acos(larc)*sign(arc))
end

Вольфрам альфа говорит, что pconcat(x,y,0) должен быть равен (x+y,0). Чаще всего так оно и есть, но если вдруг x и y окажутся близки к N*1.09054966350708617, иногда наступает военное время и косинус оказывается больше единицы. Там надо явную проверку вставить, или есть какой-то более правильный способ это починить?

Альфа предлагает через экспоненты всё переписать, там может без спецэффектов?

В альфе я честно все писал, с гиперболическими функциями, потом проверял, что в моей версии цифры примерно те же.

Видимо, надо. У меня выходит

1.000000000000000222 или иногда
1.0000000000000004441

Это ошибка в 52-м или 51-м разряде мантиссы. С учетом того, что мы делали, кроме арифметических операций, еще и вычисление корня, а разрядов мантиссы всего 53, ошибка вполне допустима, если сошлось много округлений вверх при присваивании larc.

Edited at 2017-09-20 11:27 pm (UTC)