сумма массива с плавающей точкой, состоящего из больших и маленьких элементов - PullRequest
3 голосов
/ 12 июня 2011

Мне задали этот вопрос во время java-интервью: мне нужно было выяснить сумму элементов в массиве float.Элементы, однако, состоят как из очень больших, так и из очень маленьких чисел, вопрос в том, как я могу гарантировать точность сводки?отсутствие или это разумный вопрос?

Ответы [ 4 ]

2 голосов
/ 13 июня 2011

Я подозреваю, что после интервьюера было базовое понимание округления с плавающей запятой. Добавление от наименьшего к наибольшему (по величине) чисел дает наименьшую ошибку округления, поэтому первым шагом является соответствующая сортировка массива. Затем вы можете произвести впечатление на интервьюера, также порекомендовав использовать алгоритм суммирования Кахана .

1 голос
/ 13 июня 2011

Простой ответ - использовать BigDecimal . Этот тип может содержать произвольно большие значения.

Базовый пример того, как сделать такую ​​сумму:

public BigDecimal sum(float[] floats) {
    BigDecimal sum = BigDecimal.ZERO;

    for (float aFloat : floats) {
        sum = sum.add(new BigDecimal(aFloat));
    }

    return sum;
}
0 голосов
/ 13 июня 2011

В вашем случае вы можете использовать BigDecimal тип Java.

0 голосов
/ 13 июня 2011

Если производительность можно пожертвовать ради точности, вы можете преобразовать числа с плавающей точкой в ​​BigDecimals и суммировать последние.

...