Я использую следующую арифметику, чтобы преобразовать фракцию в его шестнадцатеричный эквивалент:шестнадцатеричных арифметическое с помощью рекурсии
.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
Я не могу понять, почему моя функция продолжает выполняться, хотя после третьей итерации доля равна остатку. Я не могу найти ошибку. Что мне здесь не хватает?
[Что каждый ученый должен знать о точке airthemetic плавающей] (https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – P0W
You не может сравниться равенство для удвоений, из-за компьютерной аппроксимации. Вы должны указать допуск и проверить, меньше ли их разницы, чем определенный допуск. – Jepessen