Нахождение наименьшего числа с плавающей запятой x такого, что x + d = y - PullRequest
0 голосов
/ 16 мая 2018

Как найти наименьшее 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;
    }
}

Что делает довольно много действий, чтобы найти результат, но мне интересно:

Есть ли более эффективное решение или более стандартный способ достижения этого?

...