Commit 3572f993 authored by Jacob Kegerreis's avatar Jacob Kegerreis
Browse files

Do tweaks for merging

parent 9da3668a
......@@ -21,73 +21,39 @@
#define SWIFT_UTILITIES_H
/**
* @brief Search for a value in a monotonic array to find the index such that
* array[index] < value < array[index + 1]
* @brief Search for a value in a monotonically increasing array to find the
* index such that array[index] < value < array[index + 1]
*
* @param x The value to find
* @param arr The array to search
* @param array The array to search
* @param n The length of the array
* @param i The found index
* @param index The found index
*
* Set -1 and n for x below and above the array edge values respectively.
*/
INLINE static void find_value_in_monotonic_array(float x, float *arr, int n,
int *i) {
INLINE static void find_value_in_monotonic_array(
const float x, const float *array, const int n, int *index) {
int is_incr = (arr[n-1] > arr[0]); // Increasing or decreasing?
int i_mid, i_low = 0, i_high = n;
int index_mid, index_low = 0, index_high = n;
// Until arr[i_low] < x < arr[i_high=i_low+1]
while (i_high - i_low > 1) {
i_mid = (i_high + i_low) >> 1; // Middle index
// Until array[index_low] < x < array[index_high=index_low+1]
while (index_high - index_low > 1) {
index_mid = (index_high + index_low) / 2.f; // Middle index
// If mid < x and increasing or x < mid and decreasing
if ((arr[i_mid] <= x) == is_incr)
i_low = i_mid;
// Replace the low or high index with the middle
if (array[index_mid] <= x)
index_low = index_mid;
else
i_high = i_mid;
index_high = index_mid;
}
// Set i with the found i_low, or an error value if outside the array
if (x < arr[0])
*i = -1;
else if (arr[n-1] <= x)
*i = n;
// Set index with the found index_low or an error value if outside the array
if (x < array[0])
*index = -1;
else if (array[n-1] <= x)
*index = n;
else
*i = i_low;
*index = index_low;
}
#endif /* SWIFT_UTILITIES_H */
......@@ -26,54 +26,49 @@
int main() {
/// Test find_value_in_monotonic_array()
int n = 100;
float arr[n];
int i;
float array[n];
int index;
float x;
// Initialise test array
for (int j = 0; j < n; j++) {
arr[j] = j;
array[j] = j;
}
// Typical value
x = 42.42f;
find_value_in_monotonic_array(x, arr, n, &i);
if (i != 42) {
printf("Failed with a typical value \n");
return 1;
find_value_in_monotonic_array(x, array, n, &index);
if (index != 42) {
error("Failed with a typical value ");
}
// Value on array element
x = 33.f;
find_value_in_monotonic_array(x, arr, n, &i);
if (i != 33) {
printf("Failed with an array element \n");
return 1;
find_value_in_monotonic_array(x, array, n, &index);
if (index != 33) {
error("Failed with an array element ");
}
// Value below array
x = -123.f;
find_value_in_monotonic_array(x, arr, n, &i);
if (i != -1) {
printf("Failed with a value below the array \n");
return 1;
find_value_in_monotonic_array(x, array, n, &index);
if (index != -1) {
error("Failed with a value below the array ");
}
// Value above array
x = 123.f;
find_value_in_monotonic_array(x, arr, n, &i);
if (i != n) {
printf("Failed with a value above the array \n");
return 1;
find_value_in_monotonic_array(x, array, n, &index);
if (index != n) {
error("Failed with a value above the array ");
}
// Array slice with typical value
x = 9.81f;
n = 10;
find_value_in_monotonic_array(x, arr + 5, n, &i);
if (i != 4) {
printf("Failed with an array slice \n");
return 1;
find_value_in_monotonic_array(x, array + 5, n, &index);
if (index != 4) {
error("Failed with an array slice ");
}
return 0;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment