Как найти наименьшее float
/ double
число x
, которое удовлетворяет x + d = y
с учетом d
и y
?
(iiuc это теоретически решается путем установки fesetround (FE_DOWNWARD)
и просто делал y - d
, но в clang / Xcode я получил предупреждение о том, что FENV_ACCESS
не поддерживается и на практике обнаружил, что он не работает)
Итак, пока я сделал это:
// Find minimum x value so that x + d = y
template<typename T, bool supportDenormals = false>
T subtractMost (const T y, const T d)
{
T x = y - d;
while (true)
{
const T nextX =
x == 0 && !supportDenormals
? -std::numeric_limits<T>::min()
: nextafter (x, -std::numeric_limits<T>::infinity());
if (nextX + d != y)
return x;
T step = x - nextX;
while (true)
{
const T nextStep = step + step;
if (x - nextStep + d != y)
break;
step = nextStep;
}
x -= step;
}
}
Что делает довольно много действий, чтобы найти результат, но мне интересно:
Есть ли более эффективное решение или более стандартный способ достижения этого?