def binary_search(arr):
low, high, mid = 0, len(arr) - 1, 0
best = low
while low <= high:
mid = low + (high - low) / 2
if arr[mid] < val:
low = mid + 1
elif arr[mid] > val:
high = mid - 1
else:
best = mid
break
if abs(arr[mid] - val) < abs(arr[best] - val):
best = mid
return best