В приведенных ниже примерах используется Python. Обратите внимание, что это предполагает, что вас больше интересует быстрый способ вычисления, чем очень точный ответ.
Вы не можете просто использовать основную базу 2 на всем этом, это даст вам только разумный показатель. Затем, чтобы найти мантиссу, вы можете разделить дробную часть результата экспоненты и снова увеличить ее до этой мощности, а затем умножить на две на мощность числа бит мантиссы. Знак нужно рассматривать отдельно.
Ниже дает показатель (без смещения) и мантиссу (1 + 23 бита, как показано в шестнадцатеричном):
math.log(1.5845632e29, 2)
96.99999995421683
hex(int(math.floor(2**0.99999995421683*2**23)))
'0xffffff'
Для того, чтобы объединить все это, маску из подразумеваемой один из мантиссы, сдвиг в показатель + смещение, и закусить знак:
hex((0xffffff & 0x7fffff) | ((96+127) << 23) | (1 << 31))
техника выше, имеет некоторые ограничения - это не перехватывать исключения и могут возникнуть проблемы с точностью. И будьте осторожны, что для небольших чисел вам нужно использовать отрицательную долю для вычисления мантиссы. Чтобы сделать это более точно или для разных форматов, вам, возможно, придется делать все это без математических функций с плавающей запятой.
Вот приблизительные шаги для техники, которая хорошо работает, если ваш инструмент или язык могут поддерживать сколь угодно большие целые числа. Это легко в Python, например. C вам нужны специальные библиотеки.
- Введите номер как большое целое число от фактического значения
- Найти мощь два чуть ниже
- Умножить на два в степень числа мантиссы бит вам нужно, применять какой-либо требуется округление , затем сдвигаем вправо экспонентой.
- Вычислить показатель IEEE путем суммирования смещения
большие цифры могут не соответствовать в формате с IEEE-754. Почему бы вам просто не использовать библиотеку bignum? –
-1.5845632e29 находится в пределах диапазона, представляемого номером 'binary32' IEEE-754. Почему проблема заключается в том, чтобы вычислить log2, чтобы получить показатель экспоненты? В худшем случае его можно вычислить с помощью итерации, которая уменьшает число на каждом шаге, пока результат не окажется в пределах [1,2]. – njuffa
Выполнение базовых преобразований * точно * является трудной проблемой, я бы предложил в качестве отправной точки предложить следующую статью: Уильям Д.Клинкер, «Как точно читать числа с плавающей точкой». * ACM SIGPLAN Уведомления * 39.4 (2004): 360-371. – njuffa