Problem: While sailing on a boat, Inessa noticed a beautiful water lily flower above the lake's surface. She came closer and it turned out that the lily was exactly H centimeters above the water surface. Inessa grabbed the flower and sailed the distance of L centimeters. Exactly at this point the flower touched the water surface.

<image>

Suppose that the lily grows at some point A on the lake bottom, and its stem is always a straight segment with one endpoint at point A. Also suppose that initially the flower was exactly above the point A, i.e. its stem was vertical. Can you determine the depth of the lake at point A?

Input

The only line contains two integers H and L (1 ≤ H < L ≤ 10^{6}).

Output

Print a single number — the depth of the lake at point A. The absolute or relative error should not exceed 10^{-6}.

Formally, let your answer be A, and the jury's answer be B. Your answer is accepted if and only if \frac{|A - B|}{max{(1, |B|)}} ≤ 10^{-6}.

Examples

Input


1 2


Output


1.5000000000000


Input


3 5


Output


2.6666666666667

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
FILE* _fin = stdin;
FILE* _fout = stdout;
int _min(int a, int b) { return a <= b ? a : b; }
long long _min(long long a, long long b) { return a <= b ? a : b; }
int _max(int a, int b) { return a >= b ? a : b; }
long long _max(long long a, long long b) { return a >= b ? a : b; }
void zero(int* data, int n) { memset(data, 0, sizeof(int) * n); }
void zero(long long* data, int n) { memset(data, 0, sizeof(long long) * n); }
void zero(unsigned long long* data, int n) {
  memset(data, 0, sizeof(unsigned long long) * n);
}
void zero(char* data, int n) { memset(data, 0, sizeof(char) * n); }
char readc() {
  char var;
  fscanf(_fin, "%c", &var);
  return var;
}
int readi() {
  int var;
  fscanf(_fin, "%d", &var);
  return var;
}
double readlf() {
  double var;
  fscanf(_fin, "%lf", &var);
  return var;
}
long long readll() {
  long long var;
  fscanf(_fin, "%lld", &var);
  return var;
}
void repread(int* data, int n) {
  for (int i = 0; i < n; ++i) data[i] = readi();
}
void repread(long long* data, int n) {
  for (int i = 0; i < n; ++i) data[i] = readll();
}
int reads(char* str, int maxsize) {
  for (;;) {
    if (fgets(str, maxsize, _fin) == NULL) break;
    if (str[0] != '\n' && str[0] != '\r') break;
  }
  int slen = strlen(str);
  if (slen == 0) return 0;
  if (str[slen - 1] == '\n' || str[slen - 1] == '\r') str[--slen] = 0;
  return slen;
}
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long lcm(long long a, long long b) {
  long long g = gcd(a, b);
  return (a / g) * b;
}
void reverse(char* data, int n) {
  int k = n >> 1;
  for (int i = 0; i < k; ++i) {
    char tmp = data[i];
    data[i] = data[n - i - 1];
    data[n - i - 1] = tmp;
  }
}
void reverse(int* data, int n) {
  int k = n >> 1;
  for (int i = 0; i < k; ++i) {
    int tmp = data[i];
    data[i] = data[n - i - 1];
    data[n - i - 1] = tmp;
  }
}
void reverse(long long* data, int n) {
  int k = n >> 1;
  for (int i = 0; i < k; ++i) {
    long long tmp = data[i];
    data[i] = data[n - i - 1];
    data[n - i - 1] = tmp;
  }
}
struct Veci {
  int* data;
  int size;
  int n;
};
void init(Veci* t, int size) {
  t->data = (int*)malloc(sizeof(int) * size);
  t->size = size;
  t->n = 0;
}
void resize(Veci* t) {
  int ns = t->size * 1.2f + 1;
  t->data = (int*)realloc(t->data, sizeof(int) * ns);
  t->size = ns;
}
void add(Veci* t, int val) {
  if (t->n >= t->size) resize(t);
  int k = t->n;
  t->data[k] = val;
  t->n = k + 1;
}
void free(Veci* t) { free(t->data); }
struct Vecll {
  long long* data;
  int size;
  int n;
};
void init(Vecll* t, int size) {
  t->data = (long long*)malloc(sizeof(long long) * size);
  t->size = size;
  t->n = 0;
}
void resize(Vecll* t) {
  int ns = t->size * 1.2f + 1;
  t->data = (long long*)realloc(t->data, sizeof(long long) * ns);
  t->size = ns;
}
void add(Vecll* t, long long val) {
  if (t->n >= t->size) resize(t);
  int k = t->n;
  t->data[k] = val;
  t->n = k + 1;
}
void free(Vecll* t) { free(t->data); }
struct Vecs {
  char** data;
  int size;
  int n;
};
void init(Vecs* t, int size) {
  t->data = (char**)malloc(sizeof(char*) * size);
  t->size = size;
  t->n = 0;
}
void resize(Vecs* t) {
  int ns = t->size * 1.2f + 1;
  t->data = (char**)realloc(t->data, sizeof(char*) * ns);
  t->size = ns;
}
void add(Vecs* t, char* val) {
  if (t->n >= t->size) resize(t);
  int k = t->n;
  t->data[k] = val;
  t->n = k + 1;
}
void free(Vecs* t) { free(t->data); }
int ispali(int* a, int* b, int n) {
  for (int i = 0; i < n; ++i) {
    if (a[i] != b[n - i - 1]) {
      return 0;
    }
  }
  return 1;
}
int ispalc(char* a, char* b, int n) {
  for (int i = 0; i < n; ++i) {
    if (a[i] != b[n - i - 1]) {
      return 0;
    }
  }
  return 1;
}
struct Pairi {
  int x, y;
};
int cmp_Pairi(const void* _a, const void* _b) {
  Pairi* a = (Pairi*)_a;
  Pairi* b = (Pairi*)_b;
  if (a->x < b->x)
    return -1;
  else {
    if (a->x == b->x) {
      if (a->y == b->y) return 0;
      if (a->y < b->y)
        return -1;
      else
        return 1;
    } else {
      return 1;
    }
  }
}
void sort_Pairi(Pairi* d, int n) { qsort(d, n, sizeof(Pairi), cmp_Pairi); }
struct Pairlf {
  double x, y;
};
int cmp_Pairlf(const void* _a, const void* _b) {
  Pairlf* a = (Pairlf*)_a;
  Pairlf* b = (Pairlf*)_b;
  if (a->x < b->x)
    return -1;
  else {
    if (a->x == b->x) {
      if (a->y == b->y) return 0;
      if (a->y < b->y)
        return -1;
      else
        return 1;
    } else {
      return 1;
    }
  }
}
void sort_Pairlf(Pairlf* d, int n) { qsort(d, n, sizeof(Pairlf), cmp_Pairlf); }
int cmp_Str(const void* _a, const void* _b) {
  char* a = *((char**)_a);
  char* b = *((char**)_b);
  return strcmp(a, b);
}
void sort_Str(char** str, int n) { qsort(str, n, sizeof(char*), cmp_Str); }
long long expmod(long long x, long long n, long long m) {
  long long ans = 1;
  for (; n;) {
    if (n & 1) ans = (ans * x) % m;
    x = (x * x) % m;
    n >>= 1;
  }
  return ans;
}
long long combmod(long long n, long long k, long long m) {
  long long ret = 1;
  long long div = 1;
  for (long long i = 0; i < k; ++i) {
    ret = (ret * (n - i) % m) % m;
    div = (div * (i + 1)) % m;
  }
  div = expmod(div, m - 2, m) % m;
  return (ret * div) % m;
}
int next_perm(int* data, int n) {
  int rootidx = -1;
  for (int i = n - 2; i >= 0; --i) {
    if (data[i] < data[i + 1]) {
      rootidx = i;
      break;
    }
  }
  if (rootidx == -1) return 0;
  int ceilingidx = rootidx + 1;
  for (int i = rootidx + 2; i < n; ++i) {
    if (data[i] > data[rootidx] && data[i] < data[ceilingidx]) {
      ceilingidx = i;
    }
  }
  {
    int t = data[rootidx];
    data[rootidx] = data[ceilingidx];
    data[ceilingidx] = t;
  };
  std::sort(&data[rootidx + 1], &data[rootidx + 1] + n - rootidx - 1);
  return 1;
}
int count_digits(long long a) {
  int k = 0;
  for (;;) {
    if (a == 0) break;
    k++;
    a /= 10;
  }
  return k;
}
int bs_exists(int* data, int n, int val) {
  int left = 0;
  int right = n - 1;
  for (; left < right;) {
    int mid = (left + right + 1) >> 1;
    if (data[mid] <= val)
      left = mid;
    else
      right = mid - 1;
  }
  return right;
}
long long simple_factorial(int x) {
  long long f = 1.0;
  for (int i = 0; i < x; ++i) {
    f *= (i + 1);
  }
  return f;
}
unsigned long long djb2(char* data, int n) {
  unsigned long long h = 5381;
  for (int i = 0; i < n; ++i) h = (h << 5) + h + data[i];
  return h;
}
struct Hashcount {
  int* count;
  unsigned long long* keys;
  int size_bits;
};
void init(Hashcount* h, int size_bits) {
  h->size_bits = size_bits;
  int size = 1 << h->size_bits;
  h->count = (int*)malloc(sizeof(int) * size);
  zero(h->count, size);
  h->keys = (unsigned long long*)malloc(sizeof(unsigned long long) * size);
  zero(h->keys, size);
}
int set(Hashcount* h, unsigned long long key) {
  int index = (key * 2654435761) >> (64 - h->size_bits);
  int size = 1 << h->size_bits;
  for (int i = 0; i < size; i++) {
    if (h->keys[index] == key) {
      h->count[index]++;
      return index;
    }
    if (h->keys[index] == 0) {
      h->count[index] = 1;
      h->keys[index] = key;
      return index;
    }
    index++;
    index &= size - 1;
  }
  return -1;
}
int get(Hashcount* h, unsigned long long key) {
  int index = (key * 2654435761) >> (64 - h->size_bits);
  int size = 1 << h->size_bits;
  for (int i = 0; i < size; i++) {
    if (h->keys[index] == key) {
      return h->count[index];
    }
    if (h->keys[index] == 0) return 0;
    index++;
    index &= size - 1;
  }
  return 0;
}
int sub(Hashcount* h, unsigned long long key) {
  int index = (key * 2654435761) >> (64 - h->size_bits);
  int size = 1 << h->size_bits;
  for (int i = 0; i < size; i++) {
    if (h->keys[index] == key) {
      --h->count[index];
      if (h->count[index] < 0) h->count[index] = 0;
      return h->count[index];
    }
    if (h->keys[index] == 0) return 0;
    index++;
    index &= size - 1;
  }
  return 0;
}
void shuffleidx(int* idx, int n) {
  for (int i = 0; i < n; ++i) idx[i] = i;
  for (int i = 0; i < n; ++i) {
    int j = i + rand() % (n - i);
    int tmp = idx[i];
    idx[i] = idx[j];
    idx[j] = tmp;
  }
}
const long long MOD = 1e9 + 7;
struct Vertex {
  int idx;
  long long dist;
};
void pop(Vertex* heap, int* _nheap) {
  int nheap = *_nheap;
  if (nheap < 2) return;
  heap[1] = heap[--nheap];
  *_nheap = nheap;
  int k = 1;
  for (;;) {
    int child = k << 1;
    if (child >= nheap) break;
    if (child + 1 < nheap && heap[child + 1].dist <= heap[child].dist) child++;
    if (heap[k].dist <= heap[child].dist) break;
    Vertex tmp = heap[k];
    heap[k] = heap[child];
    heap[child] = tmp;
    k = child;
    k = child;
  }
}
void add(Vertex* heap, int* _nheap, int idx, long long dist) {
  int nheap = *_nheap;
  heap[nheap].idx = idx;
  heap[nheap].dist = dist;
  int k = nheap;
  for (;;) {
    if (k <= 1) break;
    int parent = k >> 1;
    if (heap[parent].dist <= heap[k].dist) break;
    Vertex tmp = heap[k];
    heap[k] = heap[parent];
    heap[parent] = tmp;
    k = parent;
  }
  *_nheap = nheap + 1;
}
int main() {
  {
    _fin = fopen("inputx.txt", "r");
    if (_fin == NULL) _fin = stdin;
  };
  double h = readi();
  double l = readi();
  double ans = (l * l - h * h) / (2.0 * h);
  printf("%.12f\n", ans);
  return 0;
}