Ваше утверждение, что закодированная мантисса является целым числом, смущает меня. Он должен представлять некоторую форму числа с плавающей запятой, возможно, закодированного в четыре или восемь байтов.
Для любого положительного числа x вы можете однозначно выразить x
как
x = 10^(f + n) = 10^f * 10^n
, где n
- целое число, а 0 <= f < 1
. Обратите внимание, что
f + n = log10(x)
по определению.
Для положительного x простейший код, который я могу себе представить, таков:
double lg10 = log10(x);
double f = fmod(lg10, 1.0);
int n = lg10 - f
encode_mantissa(pow(10.0, f));
encode_exponent(n);
Для отрицательного значения x
вам необходимо принять абсолютное значение перед применением вышеуказанного кода, а затем закодировать знак любым подходящим способом.
Стоимость этой операции - три нетривиальных операции с плавающей запятой, но в настоящее время все они выполняются аппаратно на процессорах общего назначения. Вам все еще нужно решить проблему кодирования мантиссы в четырех- или восьмибайтовое значение.