Я предполагаю, что сложность заключается в двоичном преобразовании, а не в кодировании с плавающей запятой IEEE (поскольку вы говорите, что знаете, как преобразовать 0,5 и 0,75).Для менее простых примеров, таких как 12.1325 * 10 -13 , я бы использовал мой двоичный преобразователь ).Для 70 мест 0,00000000000121325 равно
0,0000000000000000000000000000000000000001010101010111111111100000001111 ...
округлено (вручную) до 24 значащих бит, то есть 0,000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001float.
Еще один способ сделать это - аналитически (хотя вам понадобится хороший калькулятор произвольной точности, например, PARI / GP ).Начните с переписывания 12.1325 * 10 -13 как 121325/10 17 и попробуйте найти ближайшее число с 24-битным числителем и степенью двух знаменателей:
121325/10 17 = х / 2 n
x = (2 n * 121325) / 10 17
Вы обнаружите, что n = 63 дает вам то, что вы ищете: x = 11190256.123714056749056 = 11190256 (при округлении до ближайшего целого числа).(11190256 = 101010101011111111110000 в двоичном формате, и вы увидите, что это соответствует ответу выше.) Когда вы нормализуете число с плавающей точкой, вычтете 23 из показателя степени, что даст: 1.0101010101111111111 * 2 -40
(Последний способ см. В моей статье Правильный десятичный код с плавающей точкой с использованием больших целых чисел .)