Я ищу способ последовательно игнорировать небольшие различия между числами с плавающей запятой в R (это числа с плавающей запятой двойной точности согласно IEC 60559), используя базовые инструменты R и не прибегая к C или C ++.Другими словами, я хотел бы «округлить» значение и часть чисел с плавающей запятой двойной точности так, чтобы такие вещи возвращали ИСТИНА вместо ЛОЖЬ:
1.45 - .55 == 2.45 - 1.55
## [1] FALSE
Что-то вроде:
round_significand(1.45 - .55, bits=48) == round_significand(2.45 - 1.55, bits=48)
## [1] TRUE
Простое round
не работает, потому что уровень, до которого нам нужно округлить, зависит от величины числа.
data.table
делает что-то подобное внутри, начиная с ?setNumericRounding
:
Компьютеры не могут точно представлять некоторые числа с плавающей запятой (например, 0,6), используя базу 2. Это приводит к неожиданному поведению при объединении или группировании столбцов типа «числовой»;то есть «двойной», см. пример ниже.В тех случаях, когда это нежелательно, data.table позволяет округлять такие данные примерно до 11 sf, что во многих случаях является большим количеством цифр.Это достигается путем округления последних 2 байтов от значения.Другими возможными значениями являются округление до 1 байта или отсутствие округления (полная точность, по умолчанию).
Я работаю над реализацией взлома, которая масштабирует все до десятичного числа x
, такого, что floor(log10(x)) == 1
и округляет, например:
rnd_sig <- function(x, precision=10) {
exp <- floor(log10(abs(x)))
round(x * 10 ^ (-exp), precision) / 10 ^ (-exp)
}
, но я не знаю достаточно о числах с плавающей запятой, чтобы быть уверенным, что это безопасно (или когда это безопасно, и нет).