int lem::Math::FindLeftPoint( const RArray& xi, REAL X ) { const int i0 = xi.GetFrom(); const int in = xi.GetTo(); // »щем две точки, лежащие слева и справа от заказанной // абсциссы. const REAL xa=xi(i0), xb=xi(in); int LeftNode = i0 + int((X-xa)/(xb-xa)); int irange = (in-i0)/2+(in-i0)%2; if( X<=xa || X>=xb ) { // “очка уже вне пределов заданных абсцисс. if( X<=xa ) LeftNode=i0; else LeftNode=in-1; } else FOREVER { if( xi(LeftNode)<=X && xi(LeftNode+1)>=X ) break; if( xi.get(LeftNode)>=X ) { // »щем в левом поддиапазоне. if( (irange/=2) < 1 ) irange=1; LeftNode -= irange; if( LeftNode<i0 ) LeftNode=i0; } else { // »щем в правом поддиапазоне. if( (irange/=2) < 1 ) irange=1; LeftNode += irange; if( LeftNode>in-1 ) LeftNode=in-1; } } return LeftNode; }