Избегайте нуля с плавающей запятой при суммировании масштабированного набора чисел в R

Я масштабирую набор чисел и хочу избежать получения нуля с плавающей запятой для суммы масштабированных чисел:

x <- c(-5, 1, 8)
y <- scale(x)
sum(y)
# [1] 1.249001e-16

Есть ли способ обойти это, чтобы свести сумму к нулю? Меня не волнует точность за пределами трех знаков после запятой.


person user3343467    schedule 19.03.2018    source источник
comment
Разве эта сумма уже не является точной за пределами трех знаков после запятой?   -  person hpesoj626    schedule 19.03.2018
comment
@hpesoj626 масштабированный вектор y входит в функцию, для которой требуется sum(y) == 0. Нужно что-то, чтобы вывести меня за рамки этого утверждения if   -  person user3343467    schedule 19.03.2018
comment
как насчет того, чтобы вместо этого потребовать round(sum(y), 3) == 0 в вашей функции?   -  person hpesoj626    schedule 19.03.2018
comment
@hpesoj626 это не моя функция... пытался избежать взлома чужого кода   -  person user3343467    schedule 19.03.2018
comment
Если подпрограмма, которой передается y, требует, чтобы сумма чисел, вычисленная с помощью арифметики с плавающей запятой, была точно равна нулю, то она не предназначена для работы с арифметикой с плавающей запятой и должна быть исправлена. Принуждение элементов y к нулю не является хорошим решением, так как это увеличит ошибку.   -  person Eric Postpischil    schedule 19.03.2018


Ответы (1)


Я думаю, что вы не должны просто «переключаться» на целые числа в какой-то момент. Масштабирование было вычислено с числами с плавающей запятой и поэтому не является точным на 100%. Установка некоторых значений на 0 будет означать, что точность недоступна, и поэтому ее следует избегать.

Если вам нужно сравнить значения с плавающей запятой, используйте isTRUE(all.equal(...)), как это предлагается в документации R. https://stat.ethz.ch/R-manual/R-devel/library/base/html/all.equal.html

person AEF    schedule 19.03.2018
comment
Это не отвечает на вопрос. - person Eric Postpischil; 19.03.2018