Ошибка при сортировке массива типа 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;
}