Как изменить плавание его самым маленьким инкрементом (или близко к нему)?

    public class TestedClass {
    public LoginContext login(String user, String password) {
        LoginContext lc = new LoginContext("login", callbackHandler);
        lc.doThis();
        lc.doThat();
    }
  }

- Класс тестирования:

    @RunWith(PowerMockRunner.class)
    @PrepareForTest(TestedClass.class)
    public class TestedClassTest {

        @Test
        public void testLogin() {
            LoginContext lcMock = mock(LoginContext.class);
            whenNew(LoginContext.class).withArguments(anyString(), anyString()).thenReturn(lcMock);
//comment: this is giving mock object ( lcMock )
            TestedClass tc = new TestedClass();
            tc.login ("something", "something else"); ///  testing this method.
            // test the login's logic
        }
    }

При вызове фактического метода tc.login ("something", "something else"); из testLogin () {- этот LoginContext lc установлен в значение null и бросает NPE при вызове lc.doThis();

47
задан Owen 11 December 2008 в 03:55
поделиться

7 ответов

Проверьте свой math.h файл. Если Вы удачливы, что имеете nextafter и nextafterf функции, определяемые. Они делают точно, что Вы хотите портативным и независимым от платформы способом и являетесь частью стандарта C99.

Другой способ сделать оно (могло быть решение для нейтрализации) должно разложить Ваше плавание на часть экспоненты и мантиссу. Постепенное увеличение легко: Просто добавьте тот к мантиссе. Если Вы получаете переполнение, необходимо обработать это путем постепенного увеличения экспоненты. Постепенное уменьшение работает тот же путь.

РЕДАКТИРОВАНИЕ : Как указано в комментариях достаточно просто увеличить плавание в, он - двоичное представление. Переполнение мантиссы увеличит экспоненту, и это точно, что мы хотим.

Это - вкратце то же самое, которое делает nextafter.

Это не будет абсолютно портативно все же. Необходимо было бы иметь дело с порядком байтов и тем, что не все машины действительно имеют плавания IEEE (хорошо - последняя причина является более академической).

Также обрабатывающий NAN's и большое количество может быть немного хитрым. Вы не можете просто увеличить их, поскольку они - по определению не числа.

62
ответ дан Nils Pipenbrinck 7 November 2019 в 23:18
поделиться
u64 &x = *(u64*)(&f);
x++;

Да, серьезно.

Редактирование: , Поскольку кто-то указал, это не имеет дело с-ve числами, Inf, Nan или переполнением правильно. Более безопасная версия вышеупомянутого

u64 &x = *(u64*)(&f);
if( ((x>>52) & 2047) != 2047 )    //if exponent is all 1's then f is a nan or inf.
{
    x += f>0 ? 1 : -1;
}
23
ответ дан 7 November 2019 в 23:18
поделиться

В свободных членах самая маленькая сумма можно добавить к значению с плавающей точкой для создания нового отличного значения, будет зависеть от текущей величины значения; это будет эпсилон машины типа умноженный на текущую экспоненту.

Выезд спецификация IEEE для плавающей точки represenation. Самый простой путь состоял бы в том, чтобы дать иное толкование значению как целому типу, добавить 1, затем проверить (если Вы заботитесь), что Вы не зеркально отразили знак или генерировали NaN путем исследования битов экспоненты и знака.

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

4
ответ дан moonshadow 7 November 2019 в 23:18
поделиться

Я должен был сделать ту же самую вещь и придумал этот код:

double DoubleIncrement(double value)
{
  int exponent;
  double mantissa = frexp(value, &exponent);
  if(mantissa == 0)
    return DBL_MIN;

  mantissa += DBL_EPSILON/2.0f;
  value = ldexp(mantissa, exponent);
  return value;
}
3
ответ дан Jim Buck 7 November 2019 в 23:18
поделиться

Если это имеет значение значение, для которого стандарта ++ постепенное увеличение прекращает функционировать, 9,007,199,254,740,992.

1
ответ дан TheSoftwareJedi 7 November 2019 в 23:18
поделиться

Это не может быть точно, что Вы хотите, но Вы все еще могли бы найти numeric_limits в использования. Особенно членская минута (), и эпсилон ().

я не полагаю что что-то как mydouble + numeric_limits:: эпсилон () сделает то, что Вы хотите, если mydouble уже не близко к эпсилону. Если это, то Вы находитесь в удаче.

0
ответ дан luke 7 November 2019 в 23:18
поделиться

Я нашел этот код некоторое время назад, возможно, он поможет Вам определить самое маленькое, можно увеличить его, к тому времени просто увеличивают его тем значением. К сожалению, я не могу помнить ссылку за этот код:

#include <stdio.h>

int main()
{
    /* two numbers to work with */
    double number1, number2;    // result of calculation
    double result;
    int counter;        // loop counter and accuracy check

    number1 = 1.0;
    number2 = 1.0;
    counter = 0;

    while (number1 + number2 != number1) {
        ++counter;
        number2 = number2 / 10;
    }
    printf("%2d digits accuracy in calculations\n", counter);

    number2 = 1.0;
    counter = 0;

    while (1) {
        result = number1 + number2;
        if (result == number1)
            break;
        ++counter;
        number2 = number2 / 10.0;
    }

    printf("%2d digits accuracy in storage\n", counter );

    return (0);
}
-2
ответ дан Chris Jester-Young 7 November 2019 в 23:18
поделиться