Ponto flutuante e menor que igual após adição e subtração
Existe uma "melhor prática" comparações menores que iguais com o número de ponto flutuante após uma série de operações aritméticas de ponto flutuante?
Eu tenho o exemplo a seguir em R, embora a questão não se aplique apenas a R, mas a qualquer idioma que use pontos flutuantes. Eu tenho um duplox = 1
às quais aplico uma série de adições e subtrações. No finalx
deve ser exatamente um, mas não se deve à aritmética de ponto flutuante (pelo que entendi). Aqui está o exemplo
> stop_times <- seq(0.25, 2, by = .25)
> expr <- expression(replicate(100,{
+ x <- 1
+
+ for(i in 1:10){
+ tmp <- rexp(1, 1)
+ n <- sample.int(1e2, 1)
+ delta <- tmp / n
+ for(j in 1:n)
+ x <- x - delta
+ x <- x + tmp
+ }
+
+ # "correct" answer is 4
+ which.max(x <= stop_times)
+ }))
> eval(expr)
[1] 5 5 5 4 4 4 5 5 5 4 5 4 4 4 5 5 4 4 5 4 5 4 5 4 5 5 5 4 4 4 4 4 4 4 4 4 5 5 5 5 5 4 5 4 5 5 5 4 4 5 5 5 4 4 5 5 5 4 4 4 4 4 4
[64] 5 4 4 4 5 5 5 4 4 4 5 4 4 4 4 4 4 4 4 5 5 5 5 4 4 4 5 5 5 5 5 4 4 4 5 5 4
Uma solução (ingênua?) É adicionar algum número positivo pequeno e arbitrário ao lado direito da desigualdade, da seguinte maneira
some_arbitrary_factor <- 100
stop_times <- seq(0.25, 2, by = .25) +
some_arbitrary_factor * .Machine$double.eps
eval(expr)
[1] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
[64] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
Esta é a "melhor prática" e, em caso afirmativo, existem diretrizes sobre como escolhersome_arbitrary_factor
?
Meu problema concreto é que tenho períodos de tempo $ (t_0, t_1], (t_1, t_2], \ dots $ e preciso definir em que período uma determinada observação é $ x $. $ X $ pode ter sido definido como um dos limites $ t_i $ depois de ter passado por uma série de operações aritméticas de ponto flutuante que devem resultar em $ t_i $ se a operação exata for executada.