проблема с плавающей запятой в R?
Возможный дубликат:
Почему эти цифры не равны?
Приведенное ниже выражение, которое оценивается до 0,1, считается больше 0,1.
> round(1740/600,0) - 1740/600 [1] 0.1 > (round(1740/600,0) - 1740/600) (round(1740/600,0) - 1740/600) <= 0.1000000000000000000000000000000000000001 [1] TRUE
Думая, что проблема может быть вызвана округлением, я попробовал это с тем же результатом:
- Число округлений до 2 десятичных мест в C
- О примерном определении
- Почему я не могу назначить массивы как & a = & b?
- Функция scanf getchar пропускается
- Использование нулевого оператора в C
> 3 - 2.9 [1] 0.1 > (3 - 2.9) <=0.1 [1] FALSE
Итак, что дает и как я могу исправить это, не вымачивая обрезание?
- Неявные декларации функций в C
- Какая часть стандарта C позволяет компилировать этот код?
- C Программа для поиска дня недели данной даты
- Что такое определения, декларации и назначения C ++?
- Как числа с плавающей запятой сохраняются в памяти?
- Несколько символов в символьной константе
- Как получить длину функции в байтах?
- C: Приведение минимального 32-битного целого числа (-2147483648) к float дает положительное число (2147483648.0)
Из руководства по плавающей запятой :
Почему мои цифры, например, 0,1 + 0,2, составляют хороший раунд 0,3, и вместо этого я получаю странный результат, например 0.30000000000000004?
Поскольку внутренне компьютеры используют формат (двоичный с плавающей запятой), который не может точно представлять число, например 0,1, 0,2 или 0,3.
Когда код компилируется или интерпретируется, ваш «0,1» уже округляется до ближайшего номера в этом формате, что приводит к небольшой ошибке округления даже до того, как произойдет расчет.
Что я могу сделать, чтобы избежать этой проблемы?
Это зависит от того, какие вычисления вы делаете.
- Если вам действительно нужны ваши результаты, чтобы точно складываться, особенно когда вы работаете с деньгами: используйте специальный десятичный тип данных.
- Если вы просто не хотите видеть все эти дополнительные десятичные знаки: просто отформатируйте результат, округленный до фиксированного числа десятичных знаков при его отображении.
- Если у вас нет десятичного типа данных, альтернативой является работа с целыми числами, например, расчеты денег полностью в центах. Но это больше работы и имеет некоторые недостатки.
Есть R-функции, которые автоматически принимают разумные подходы к «проблеме равенства»:
> (3 - 2.9) <=0.1 #[1] FALSE > all.equal( (3 - 2.9) , 0.1) #[1] TRUE
В качестве порога по умолчанию используется sqrt наименьшего числа положительных чисел с плавающей запятой R, поэтому он обрабатывает ошибки умножения и разложения. Заканчивается около 1е-08