BRepClass3d_SolidClassifier::Perform takes in a tolerance. However, in its implementation it creates IntCurvesFace_Intersector with default tolerance of Precision::confusion. While classifying a point with respect to a face (while classifying a point with respect to a solid), it classifies a point to be outside of face, even if it lies within the given tolerance. As a result, though the point lies ON the face, it classifies the solid as INSIDE since it found only one intersection.
The way to handle it is to be able to specify tolerance for each IntCurvesFace_Intersector::Perform call. Also, it should also take into consideration the tolerance of the edges and vertices of the face.
Or is there a better way of checking a point with respect to a solid within the given tolerance?