Перебор всех значений с плавающей запятой с помощью Java

Я разрабатываю математическую функцию и хотел бы проверить ее вывод при каждом значении с плавающей запятой в пределах диапазона. Я уже делал это на C++, но теперь хочу сравнить производительность с Java. Как перебрать все значения с плавающей запятой в Java?

В C++ я просто перебираю необходимый диапазон с целым числом без знака, а затем переинтерпретирую его как указатель с плавающей запятой.

float *x = reinterpret_cast<float*>(&i);

Однако как это можно сделать в Java? Желательно быстро, так как я проверяю производительность (без строковых решений, спасибо: D). Если нет быстрого способа, я думаю, я мог бы просто предварительно вычислить миллион из них в массив и выполнить итерацию по ним. Но это испортит производительность кеша, поэтому я думаю, что использование случайных чисел было бы лучше для моего случая, хотя это не совсем соответствует всем значениям.


person Perdex    schedule 01.09.2018    source источник
comment
Обратите внимание, что доступ к float через reinterpret_cast‹float *›(&i)` для unsigned int i не является правильным способом переинтерпретации байтов в C++. Правильным способом, поддерживаемым стандартом C++, является float x; std::memcpy(&x, &i, sizeof x);, при условии, что float и unsigned int имеют одинаковый размер.   -  person Eric Postpischil    schedule 01.09.2018


Ответы (2)


Вы можете использовать Math.nextUp(float) чтобы получить следующее число с плавающей запятой.

Пример печати следующих 100 чисел с плавающей запятой, начиная с 1:

float n = 1f;
System.out.println(n);

for (int i = 0; i < 100; i++) {
    n = Math.nextUp(n);
    System.out.println(n);
}
person Loris Securo    schedule 01.09.2018
comment
Будет ли Math.nextUp(n); генерировать -0.0? - person chux - Reinstate Monica; 02.09.2018
comment
@chux Я не знал разницы между 0.0 и -0.0, но тестирование приведенного выше кода, начиная с -0.000000000000000000000000000000000000000000001f, действительно генерирует -0.0, а nextDown из положительного числа генерирует 0.0. - person Loris Securo; 02.09.2018
comment
Я подозреваю, что Math.nextUp(-0.0); идет к тому же положительному числу, что и Math.nextUp(0.0);, таким образом пропуская 0.0 при повышении. Это соответствует цели OP по итерации всех значений с плавающей запятой, даже если она не выполняет итерацию по всем комбинациям float, таким как Float.intBitsToFloat(). - person chux - Reinstate Monica; 02.09.2018