0

Предположим, что у меня есть алгоритм, с помощью которого я могу вычислить бесконечно точное число с плавающей запятой (в зависимости от параметра N) позволяет сказать, что в псевдокоде:Расщепление число с плавающей точкой в ​​виде суммы с плавающей точкой фиксированной точности

arbitrary_precision_float f = computeValue(n); //it could be a function which compute a specific value, like PI for instance. 

Я думаю, я могу реализовать computeValue(int) с библиотекой MPF библиотеки gnump, например ...

во всяком случае, как я могу разделить такое количество в суммах с плавающей запятой, где каждое число имеет L цифр мантиссы?

//example 
f = x1 + x2 + ... + xn; 
/* 
for i = 1:n 
    xi = 2^ei * Mi 
Mi has exactly p digits. 
*/ 

Я не знаю, ясно ли я, но я ищу что-то «простое».

+0

Почему бы просто не разбить (двоичную) нотацию 'f' на группы цифр' p'? – Petr

+0

из-за нормализации? – user8469759

+0

Извините, не могли бы вы уточнить больше? – Petr

ответ

0

Вы можете использовать очень простой алгоритм. Предположим без потери общности, что показатель вашего исходного числа равен нулю; если это не так, то вы просто добавляете этот показатель всем экспонентам ответа.

Разделите свой номер f на группы из L цифр и обработайте каждую группу как отдельную xi. Любая такая группа может быть представлена ​​в форме, в которой вы нуждаетесь: мантисса будет именно этой группой, а экспоненту будет отменена начальная позиция группы в исходном номере (то есть i*L, где i - номер группы).

Если какой-либо из полученных xi s начинается с нуля, вы просто переставляете его мантиссой, корректируя показатель соответственно.

Например, для L=4

f = 10010011100 
    1001  
     0011 
      100 
-> x1=1.001 *2^0 
    x2=0.011 *2^{-4} = 1.1*2^{-6} 
    x3=1.00 *2^{-8} 

Другой вопрос возникает, если вы хотите, чтобы минимизировать количество цифр вы получите. В приведенном выше примере достаточно двух чисел: 1.001*2^0+1.11*2^{-6}. Это отдельный вопрос, и на самом деле это простая проблема для динамического программирования.

+0

Как сделать в случае минимизации количества числа, которое я получаю? Из любопытства это может быть полезно. – user8469759

+0

@ Lukkio, немного читайте о динамическом программировании. Как только вы обрабатываете 'f' как последовательность 0s и 1s, она обращается к простой проблеме DP. – Petr

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