Problem:
MathJax.Hub.Config({
tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});

Koto Municipal Subway

Koto市営地下鉄

Koto市は，下図のように，道路が碁盤の目状である有名な街である．
南北に伸びる道と東西に伸びる道は，それぞれ1kmの間隔で並んでいる．
Koto市の最も南西の交差点にあるKoto駅を (0, 0) として，そこから東に x km，北に y km 進んだ位置を (x, y) と記すこととする (0 ≤ x, y である)．

5年後に開かれるオリンピックにより観光客が増大することを見越して，市はKoto駅を始発駅とする新しい地下鉄の路線を建設することを決めた．
現在，Koto駅の次の駅として新しく建設されるShin-Koto駅までのレールを敷く計画を立てている．
レールは，Koto駅からShin-Koto駅に向かってまっすぐ敷く．
従って，Shin-Koto駅の場所を (x, y) としたとき，レールの長さは， √(x2 + y2) である．
レールを敷くための費用は，敷いたレールの長さ分だけ必要になる．
レールの長さが1.5kmのように小数であっても，費用も同じように1.5必要となる．

Shin-Koto駅の場所 (x, y) はまだ決定しておらず，以下の条件を満たす場所にする予定である．

交差点である．つまり， x と y がそれぞれ整数である．

Koto駅から道路に沿って歩いた最短距離が，ちょうど D である．つまり， x + y = D を満たす．

上の2つの条件を満たす中で，市が定めるレールの予算 E とレールの費用とのずれ | √(x2 + y2) - E | が最小となるようにShin-Koto駅の場所を選ぶ．
ここで |A| は， A の絶対値を表す．
あなたの仕事は，上記のようにShin-Koto駅を建設したときの，レールを敷くための費用と予算とのずれを出力するプログラムを作成することである．

Input

入力は，複数のデータセットから構成され，1つの入力に含まれるデータセットの数は100以下である． 各データセットの形式は次の通りである．

D E

D (1 ≤ D ≤ 100)は，Koto駅からShin-Koto駅まで道路に沿って歩いたときの最短距離を表す整数である．
E (1 ≤ E ≤ 100)は，レール建設のための予算を表す整数である．

入力の終わりは，空白で区切られた2つのゼロからなる行によって示される．

Output

各データセットに対して，問題の条件を満たすようにレールを敷いたときの費用と予算とのずれを1行で出力せよ．
答えには 10-3 を越える絶対誤差があってはならない．
各行の終わりに改行を出力しなかった場合や，不必要な文字を出力した場合，誤答と判断されてしまうため，注意すること．

Sample Input

2 1
7 5
7 6
7 7
76 5
8 41
0 0

Output for Sample Input

0.4142135624
0
0.0827625303
0
48.7401153702
33

Hint

1つ目のデータセットでは，下図のように，Koto駅から道路に沿って2km進んだ交差点がShin-Koto駅を建設する場所の候補となる．

各交差点にShin-Koto駅を建設した場合の，レールを敷くための費用と予算1とのずれは次のようになる．

(2, 0) ： | √(22 + 02) - 1 | = 1.0

(1, 1) ： | √(12 + 12) - 1 | = 0.4142135623...

(0, 2) ： | √(02 + 22) - 1 | = 1.0

よって，費用と予算とのずれが最小になるのは， (1, 1) に建設した場合となる．

Solution in JAVA (judge verdict: Accepted)

import java.util.ArrayList;
import java.util.Scanner;

public class Main {

	static int[][] map;
	static int[][] directions8 = { { -1, -1 }, { -1, 0 }, { -1, 1 }, { 0, -1 }, { 0, 1 }, { 1, -1 }, { 1, 0 },
			{ 1, 1 } };
	static int[][] directions4 = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };
	static double ans;

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		while (true) {

			int D = sc.nextInt();
			int E = sc.nextInt();

			if ((D | E) == 0) {
				break;
			}

			int tmpX = 0;
			int tmpY = D;

			ans = Double.MAX_VALUE;

			for (int j = 0; j <= D; j++) {
				tmpX = j;
				tmpY = D - j;
				double tmpAns = Math.sqrt(tmpX * tmpX + tmpY * tmpY) - E;
				tmpAns = Math.abs(tmpAns);
				ans = Double.min(ans, tmpAns);
			}
			System.out.println(ans);
		}
	}

	// 素数判定
	static boolean isPrime(long n) {
		if (n == 2)
			return true;
		if (n < 2 || n % 2 == 0)
			return false;

		int i = 3;
		while (i <= Math.sqrt(n)) {
			if (n % i == 0)
				return false;
			else
				i += 2;
		}
		return true;
	}

	// BFS用に二つの配列を足し算する
	static int[] addArrayElms(int[] a, int[] b) {
		int[] c = new int[a.length];
		for (int i = 0; i < a.length; i++) {
			c[i] = a[i] + b[i];
		}
		return c;
	}

	// //二分探索
	// k <= num となる最小の配列要素kのインデックスを返す
	static private int binarySearch(long num, long[] orderedArray) {
		int lowerBorder = -1;
		int upperBorder = orderedArray.length;
		int mid;

		while (upperBorder - lowerBorder > 1) {
			mid = (upperBorder + lowerBorder) / 2;
			if (orderedArray[mid] <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			}
		}
		return lowerBorder;
	}

	// 二分探索
	// k <= num となる最小のList要素kのインデックスを返す
	static private int binarySearch(long num, ArrayList<Long> orderedList) {
		int lowerBorder = -1;
		int upperBorder = orderedList.size();
		int mid;

		while (upperBorder - lowerBorder > 1) {
			mid = (upperBorder + lowerBorder) / 2;
			if (orderedList.get(mid) <= num) {
				lowerBorder = mid;
			} else {
				upperBorder = mid;
			}
		}
		return lowerBorder;
	}

	// aとbの最小公倍数を求める
	public static int gcd(int a, int b) {
		return b == 0 ? a : gcd(b, a % b);
	}

	public static long gcd(long a, long b) {
		return b == 0 ? a : gcd(b, a % b);
	}
}