Подтвердить что ты не робот

Как изменить float по наименьшему приращению в Java?

У меня есть значение double d и мне хотелось бы немного подтолкнуть его немного больше (или меньше), чтобы получить новое значение, которое будет как можно ближе к оригиналу, но все же строго больше (или меньше) оригинала.

Он не должен быть близок к последнему биту - более важно, что любое изменение, которое я делаю, гарантированно производит другое значение, а не назад к оригиналу.

(Этот вопрос задавали и отвечали за C, С++)

Причина, по которой я нуждаюсь в этом, заключается в том, что я преобразовываю из Double в (что-то), и у меня может быть несколько элементов с двойным значением "save", но все они должны идти индивидуально на карту.

Мой текущий код (который выполняет задание) выглядит следующим образом:


private void putUniqueScoreIntoMap(TreeMap map, Double score,
            A entry) {

        int exponent = 15;
        while (map.containsKey(score)) {
            Double newScore = score;
            while (newScore.equals(score) && exponent != 0) {
                newScore = score + (1.0d / (10 * exponent));
                exponent--;
            }
            if (exponent == 0) {
                throw new IllegalArgumentException("Failed to find unique new double value");
            }
            score = newScore;
        }
        map.put(score, entry);
    }

4b9b3361

Ответ 1

Используйте Double.doubleToRawLongBits и Double.longBitsToDouble:

double d = // your existing value;
long bits = Double.doubleToLongBits(d);
bits++;
d = Double.longBitsToDouble(bits);

Как работает IEEE-754, который даст вам ровно следующий жизнеспособный двойной, т.е. наименьшее количество, большее, чем существующее значение.

(В конце концов он ударит NaN и, вероятно, останется там, но он должен работать на разумные значения.)

Ответ 2

В Java 1.6 и более поздних версиях метод Math.nextAfter(double, double) является самым чистым способом получить следующее значение double после заданного double значение.

Второй параметр - это направление, которое вы хотите. В качестве альтернативы вы можете использовать Math.nextUp(double) (Java 1.6 и более поздние версии), чтобы получить следующее большее число, и с Java 1.8 вы также можете использовать Math.nextDown(double) для получения следующего меньшего числа. Эти два метода эквивалентны использованию nextAfter с положительной или отрицательной бесконечностью, так как направление двойное.

В частности, Math.nextAfter(score, Double.MAX_VALUE) даст вам ответ в этом случае.

Ответ 3

Рассматривали ли вы использование структуры данных, которая позволяла бы нескольким значениям, хранящимся под одним и тем же ключом (например, двоичным деревом) вместо попытки взломать значение ключа?

Ответ 4

d += Double.MIN_VALUE

(или -=, если вы хотите отнять)

Ответ 6

Используйте Double.MIN_VALUE.

javadoc для этого:

A constant holding the smallest positive nonzero value of type double, 2-1074. It is equal to the hexadecimal floating-point literal 0x0.0000000000001P-1022 and also equal to Double.longBitsToDouble(0x1L).