In most constructive systems of analysis, there are two kinds of equality.
The first is "intensional" equality. If you imagine that two real numbers are given by computer programs, the numbers are equal in this sense if they have the exact same program. In particularly, if I "give you" two numbers, you can tell immediately if they are intensionally equal or not.
The second is "extensional" equality. Two real numbers are defined to be equal in this sense if, for every $\epsilon > 0$, the distance between the numbers is less than $\epsilon$. Given two numbers, there may be no way to tell if they are extensionally equal. So extensional equality is really just an equivalence relation, although it does act something like "equality".
This way of working is very common in constructive mathematics: many objects come equipped with an equivalence relation of "extensional equality", which is often not decidable.
Actually, in constructive settings it can be more convenient to define what it means for two numbers to be not extensionally equal. Two numbers are separated if there is a natural number $n$ such that the distance between the numbers it at least $1/n$. This is a more useful definition, constructively, because it has an existential quantifier. The direct negation of "not extensionally equal" would only have a negated universal quantifier, which cannot be converted to an existential quantifier in many constructive systems.
Because we don't have the law of the excluded middle, there end up being three cases for the relationship between two reals in a typical constructive system:
- (We know that) they are extensionally equal
- (We know that) they are separated
- We do not know whether they are extensionally equal or whether they are separated.
What classical logic does is to eliminate the third option, because classically "extensionally equal" is equivalent to the negation of "separated".