2013-09-12 2 views
2

Что такое наименьшее значение поплавка A, так что (x < x + A) == true?Самый маленький эпсилон, чтобы изменить результат сравнения

Я попытался с Float.MIN_VALUE но удивительно (? [1]) не работает

Зная, как IEEE 754 стандартные магазины всплывают значения (значения 0. исключением), я мог бы просто добавить 1 к мантиссе поплавка в вопросе, но эти швы действительно взламывают. Я не хочу ставить байтовые массивы и битовые операции в моем коде для такого тривиального вопроса, особенно с Java. Кроме того, если я просто добавлю 1 к Float.floatToIntBits(), а мантисса - все 1, это увеличит показатель на 1 и установит мантисса равным 0. Я не хочу реализовывать все обработки этих случаев, если это не обязательно.

Нет ли какой-либо функции (надеюсь, встроенной), которая задана поплавком x, она возвращает наименьший поплавок A такой, что (x < x + A) == true? Если нет, то какой будет самый чистый способ его реализации?

Я использую это, потому что, как я итерация линии вершин

// return the next vertices strictly at the left of pNewX 
float otherLeftX = pOppositeToCurrentCave.leftVertexTo(pNewX); 
// we add MIN_VALUE so that the next call to leftVertexTo will return the same vertex returned by leftVertexTo(pNewX) 
otherLeftX += Float.MIN_VALUE; 
while(otherLeftX >= 0 && pOppositeToCurrentCave.hasLeftVertexTo(otherLeftX)) { 
    otherLeftX = pOppositeToCurrentCave.leftVertexTo(otherLeftX); 
    //stuff 
} 

Прямо сейчас из-за этой проблемы первая вершина всегда пропускается, поскольку второй вызов leftVertexTo(otherLeftX) не возвращается то же значение, которое оно вернуло при первом вызове

[1] Не так удивительно. Я случайно понимаю, после того, как я заметил проблему, так как разрыв между поплавками относителен, ибо независимо от количества! = 0 MIN_VALUE настолько мал, что она будет урезана и (x = x + FLOAT.MIN_VALUE) == true

+1

Там нет ни одного ответа; ответ зависит от 'x'. Если 'x' является' double' между '2^n' и' 2^(n + 1) ', то наименьший float' A' равен '2^(n-51)' (или, может быть, 'n-52 '); это зависит от величины 'x'. Я думаю, что классический способ проверить, чтобы 'x' и' y' были достаточно близки к равному: '(abs (x-y)/abs (x)) ajb

+1

Я знаю, что это зависит от X. Процитировать сам: «Разве нет какой-то функции (надеюсь, встроенной), которая задала float x, она возвращает наименьший float A такой, что (x

+3

Размер шага к следующему представляемому значению ** не ** совпадает с наименьшим 'A', таким как' x

ответ

3

Вы можете попробовать Math.nextUp(x)

Вот doc:

Возвращает значение с плавающей точкой, смежное с f в направлении положительной бесконечности. Этот метод семантически эквивалентен nextAfter (f, Float.POSITIVE_INFINITY); однако реализация nextUp может работать быстрее, чем ее эквивалент nextAfter.

Особые случаи:

If the argument is NaN, the result is NaN. 
    If the argument is positive infinity, the result is positive infinity. 
    If the argument is zero, the result is Float.MIN_VALUE 

Параметры:

f - starting floating-point value 

Возвращает:

The adjacent floating-point value closer to positive infinity. 
+0

Определенно, что я искал! Я действительно положил идею, которую вы использовали в комментариях к моему вопросу, но я не знал о Math.nextUp. благодаря –

Смежные вопросы