Возвращается undefined, при попытке сравнить MAX_VALUE
Задача состоит в поиске среднего арифметического . но тесты падают даже не проходя сравнение value1 и value2 подскажите тонкости работы с ними . ниже тесты .
function getAverage(value1, value2) {
if (value1 + value2 == Infinity){
if (value1>value2){
return (Number.MAX_VALUE - (Number.MAX_VALUE - (value2))/2); //(макс_число -(макс-2)/2)
}else if(value1<value2){
return (Number.MAX_VALUE - (Number.MAX_VALUE - (value1))/2); // (макс - (-макс/2)/2)
}
}else {
return (value1 + value2)/2;
}
}
Тесты
it.optional('getAverage should return an average of two numbers', function() {
assert.equal(5, tasks.getAverage(5, 5));
assert.equal(5, tasks.getAverage(10, 0));
assert.equal(0, tasks.getAverage(-3, 3));
assert.equal(Number.MAX_VALUE-1, tasks.getAverage(Number.MAX_VALUE-2, Number.MAX_VALUE));
assert.equal(Number.MAX_VALUE / 4, tasks.getAverage(Number.MAX_VALUE, -Number.MAX_VALUE / 2));
});
Ответы (2 шт):
Автор решения: Igor
→ Ссылка
function getAverage(value1, value2) {
return value1 / 2 + value2 / 2;
}
console.log(getAverage(5, 5), 5);
console.log(getAverage(10, 0), 5);
console.log(getAverage(-3, 3), 0);
console.log(getAverage(Number.MAX_VALUE - 2, Number.MAX_VALUE), Number.MAX_VALUE - 1);
console.log(getAverage(Number.MAX_VALUE, -Number.MAX_VALUE / 2), Number.MAX_VALUE / 4);
Автор решения: Qwertiy
→ Ссылка
JS использует double в качестве числового типа данных, а значит, в большинстве случаев его можно делить и умножать на 2 без потери точности. А вот складывать и вычитать - не всегда:
console.log(2**53 - 2)
console.log(2**53 - 1)
console.log(2**53 )
console.log(2**53 + 1) // <<<
console.log(2**53 + 2)
Если алгоритм из вопроса верен, то он явно предполагает целочисленный тип с возможным переполнением, а не вещественный.
Скорее всего, надо что-то из этого (в зависимости от ожидаемых входных параметров):
function avg1(a, b) {
return (a + b) / 2
}
function avg2(a, b) {
return a / 2 + b / 2
}
function avg3(a, b) {
return a / 2 * 2 === a || b / 2 * 2 === b
? a / 2 + b / 2
: (a + b) / 2
}
for (var [a, b] of [
[0, 0], [1, 10], [2**53, 1], [1, 2**53],
[Number.MAX_VALUE, 1],
[Number.MAX_VALUE, Number.MAX_VALUE],
[Number.MIN_VALUE, Number.MIN_VALUE],
[3 * Number.MIN_VALUE, 3 * Number.MIN_VALUE],
[Number.MIN_VALUE, 3 * Number.MIN_VALUE],
]) {
console.log(`${a} ${b} => ${avg1(a,b)} ${avg2(a,b)} ${avg3(a,b)}`)
}
.as-console-wrapper.as-console-wrapper { max-height: 100vh }