Ошибка при сортировке массива типа double

В моём распоряжении функция для сортировки массивов различного типа и массив типа double. Написал две функции для сравнения и перемены местами значений массива. Но при выполнении программы числа с одинаковой экспонентой не сортируются. Подскажите пожалуйста в чём ошибка.

функция сортировки

void Sort
(
    char* pcFirst,              // указатель на первый сортируемый элемент 
    int nNumber,                // количество сортируемых элементов
    int size,                   // размер элемента в байтах
    void(*Swap)(void*, void*),  // указатель на функцию перестановки элементов
    int(*Compare)(void*, void*) // указатель на функцию сравнения элементов
)
{
        int i;
        for (i = 1; i < nNumber; i++)
        
            for (int j = nNumber - 1; j >= i; j--)
            {
                char* pCurrent = pcFirst + (j * size);    //указатель на текущий элемент
                char* pPrevious = pcFirst + (j - 1)*size; //указатель на предыдущий элемент

                if ((*Compare)(pPrevious, pCurrent) > 0) // если возращаемое значение >0 то требуется переставить
                {                                   
                    (*Swap)(pPrevious, pCurrent); // меняем местами
                }
            }
}   

функция сравнения

int CmpDouble(void* p1, void* p2)
{
    
    int nResult;
    double discrepancy = 1e-7;
    

    if ((abs(*(static_cast<double*>(p1)) < discrepancy)) < ((abs (*(static_cast<double*>(p2))) < discrepancy)))
    {
        nResult = (*(static_cast<double*>(p1)) -*(static_cast<double*>(p2)));
    }
    else if ((abs(*(static_cast<double*>(p1)) < discrepancy)) == ((abs(*(static_cast<double*>(p2))) < discrepancy)))
    {
        nResult = (*(static_cast<double*>(p1)) - *(static_cast<double*>(p2)));
    }
    else if ((abs(*(static_cast<double*>(p1)) < discrepancy)) > ((abs(*(static_cast<double*>(p2))) < discrepancy)))
    {
        nResult = (*(static_cast<double*>(p1)) - *(static_cast<double*>(p2)));
    }

    return nResult;
}   

функция перестановки

void SwapDouble(void* p1, void* p2) 
{
    double tmp;
    tmp = *(static_cast<double*>(p1));
    *(static_cast<double*>(p1)) = *(static_cast<double*>(p2));
    *(static_cast<double*>(p2)) = tmp;
}

Ответы (0 шт):