1) посчитать с плавающей точкой... 2) написать 64-битную арифметику
самостоятельно (это сделано в C-библиотеках многих процессоров на
самом-то деле -- подсмотреть можно в libgcc), 3) взять библиотеку
вроде BigNum (в RSA для pic18 такая какая-то и использовалась!) и
посчитать с неограниченной разрядностью. По пункту 2 на самом деле
проблема с делением. Лучше извернуть до cnt*other_coeff
>> N. А уж умножить совсем не проблема,
условно-поразрядно: a * b = (ahi*K + alo)*(bhi*K + blo) = ahi*bhi*K2 + (alo*bhi + ahi*bhi)*K + alo*blo
Где K2 -- это сдвиг влево на 64, а K -- сдвиг влево на 32 разряда.
Как сказано выше, задача может быть сведена к произведению и откидыванию младших разрядов.
Где множитель other_coeff = (k*1000 + coeff - 1) / coeff (где k = 2n). Часть "+coeff-1" нужна для округления.
Но работать это будет только для коэффициентов, условно, известных в момент компиляции. Для произвольных придётся делить на контроллере. Если множество коэффициентов фиксированное -- вариант. Если коэффициенты произвольные, то придётся осваивать один из алгоритмов деления...
Поделить можно в столбик, поразрядно, как в школе учили. Только в двоичной форме. В принципе алгоритм легко пишется на ассемблере... Например вот ссылка: http://bearcave.com/software/divide.htm
(приложил к сообщению, на случай отключения от интернета: divide.c
Описание алгоритмов деления используемых в библиотеке GMP:
https://gmplib.org/manual/Division-Algorithms#Division-Algorithms
Алгоритм деления на константу через умножение на обратную величину (то, что используется современными компиляторами, не уверен, впрочем, что к последним относится picc18...):
divcnst-pldi94_1_.pdf
В алгоритме суть, как использовать меньшее число разрядов-регистров. По-простому если, см. формулу выше.
Ссылки по теме (о 64-битном делении в C-бибиотеке):
http://caxapa.ru/1033958
Из ссылок по последней ссылке можно выдрать готовый код.