2017-01-28 5 views
-1

Я использую следующую арифметику, чтобы преобразовать фракцию в его шестнадцатеричный эквивалент:шестнадцатеричных арифметическое с помощью рекурсии

.142857 * 16 = 2.285712 
.285712 * 16 = 4.571429 

Где держать умножение остатка до тех пор, пока либо равен исходному остатка или нулю.

Так что я написал эту функцию, чтобы попытаться выполнить эту арифметику рекурсивно:

int * getHex(int * arr, double original, double result, int index) { 
    double newResult, fraction, integer; 
    newResult = result; 
    fraction = modf(newResult, &integer); 
    cout << "fraction " << fraction << " the result " << rem << endl; 
    arr[index] = (int)integer; 
    if(fraction == original) cout << "test" << endl; 
    if (fraction == 0 || fraction == original) { 
     return arr; 
    } 
    index += 1; 
    return resultToHex(hexArr, result, fraction * 16, index); 
} 

Я называю этот метод, как так:

int * arr = new int[100]; 
int num = stoi(numerator, nullptr, 16); 
int den = stoi(denominator, nullptr, 16); 
double rem = 1 + ((double)(num - den)/den); 
double result = rem * 16; 

arr = getHex(arr, rem, result, 0); 

Проблема заключается в том, что fraction никогда не равна rem передается в , хотя, когда я cout, я вижу, что в какой-то момент fraction определенно равен rem. Пример того, что я говорю:

Где числителе 1 и знаменателе 7:

rem = .142857 
result = 2.28571 

Тогда я вызываю функцию, передавая в приведенном выше в качестве аргументов:

getHex(arr, rem, result, 0); 

и это результат из cout внутри getHex:

the fraction 0.285714 result 0.142857 
the fraction 0.571429 result 0.142857 
the fraction 0.142857 result 0.142857 // the fraction equals the original remainder 
the fraction 0.285714 result 0.142857 
the fraction 0.571429 result 0.142857 
the fraction 0.142857 result 0.142857 
the fraction 0.285714 result 0.142857 
the fraction 0.571429 result 0.142857 
the fraction 0.14286 result 0.142857 
the fraction 0.285767 result 0.142857 
the fraction 0.572266 result 0.142857 
the fraction 0.15625 result 0.142857 
the fraction 0.5 result 0.142857 
the fraction 0 result 0.142857 

Я не могу понять, почему моя функция продолжает выполняться, хотя после третьей итерации доля равна остатку. Я не могу найти ошибку. Что мне здесь не хватает?

+1

[Что каждый ученый должен знать о точке airthemetic плавающей] (https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – P0W

+0

You не может сравниться равенство для удвоений, из-за компьютерной аппроксимации. Вы должны указать допуск и проверить, меньше ли их разницы, чем определенный допуск. – Jepessen

ответ

1

< == Вы сравниваете двойные значения для равенства.

Вы никогда не должны этого делать.

Он никогда не работает.

Существует множество сообщений о том, почему сравнение двойных или плавающих значений для равенства не работает.

Например: How dangerous is it to compare floating point values?

Смежные вопросы