Я не думаю, что с вашим решением для массива элементов с плавающей запятой что-то не так (я предполагаю, что нет NaN). std::min
возвращает ссылку на свой аргумент с более низким значением (которое определено для номеров FP, не относящихся к Nan). Таким образом, std::min(arr[i], arr[min_index])
:
- либо возвращает ссылку на
arr[i]
, если она меньше или равна arr[min_index]
, - , либо возвращает ссылку на
arr[min_index]
, если это больше, чем arr[i]
.
В 1., когда вы сравниваете результат std::min
с arr[i]
, вы сравниваете два очень одинаковых объекта FP, которые гарантированно будут оценены ot true
.
В 2. вы сравниваете два объекта FP с разными значениями, которые гарантированно оцениваются как false
.
Поэтому, я думаю, ваше решение работает хорошо ,
Имейте в виду, что ошибки округления за пределами вашего решения могут , казалось бы, сломать его. Рассмотрим следующий пример:
float arr[3] = { 1.0f / 3.0f, 0.33333334, 2.0f };
size_t min_index = 0;
for (size_t i = 1; i < 3; i++)
min_index = std::min(arr[i], arr[min_index]) == arr[i] ? i : min_index;
std::cout << min_index;
1/3 - наименьшее число, но это напечатало 1 в моего эксперимента , поскольку ваш код сравнивается компьютерное представление из 1.0f/3.0f
с компьютерное представление из 0.33333334
, которые оба являются объектами округления. Следовательно, числа, фактически сохраненные в arr
, отличаются.