Функция потолка в R неточная (иногда) - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь округлить число x, чтобы его можно было разделить на число m. Используя следующую функцию из предыдущего поста на SO:

roundUP = function(x,m) 
{
    return(m * ceiling(x/m))
}

Но, когда я ввожу x = 0,28 и m = 0,005 , функция выводит 0,285, когда результат должен быть 0,28.

Когда я пытался ceiling(0.28/0.005), он выдает 57, когда результат должен быть 56, поскольку 56 - это уже целое число. Может кто-нибудь объяснить, если это происходит, и это ошибка из функции Ceiling?

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Проблема связана с арифметикой с плавающей запятой. Вы можете найти некоторые подробности об этом здесь .

Пройдите через код ниже, и это должно пролить некоторый свет на то, что происходит.

0.28/0.005  # Console displays 56
0.28/0.005 == 56  # returns FALSE. Why?
print(0.28/0.005, digits = 18)  # 56.0000000000000071

# Solution?
roundUP = function(x, m) 
{
  return(m * ceiling(round(x/m, 9)))
}

Также обратите внимание на раздел Warning в ?ceiling

Реалии компьютерной арифметики могут привести к неожиданным результатам, особенно с полом и потолком. Например, мы «знаем», что floor (log (x, base = 8)) для x = 8 равен 1, но 0 был замечен на R Платформа. Обычно необходимо использовать допуск.

0 голосов
/ 02 сентября 2018

В Р,

Функция

floor (x) округляет до ближайшего целого числа, которое меньше x.

потолок (х) функция округляет до ближайшего целого числа, которое больше х.

Итак, каким бы ни было значение после десятичной точки, R рассматривает следующее целое число (до / после).

Если вы хотите 56 в качестве вывода, вы должны использовать floor(0.28/0.005).

...