Чудные примеры? Что относительно того, чтобы использовать гамма-функцию! С тех пор, Gamma n = (n-1)!
.
let rec gamma z =
let pi = 4.0 *. atan 1.0 in
if z < 0.5 then
pi /. ((sin (pi*.z)) *. (gamma (1.0 -. z)))
else
let consts = [| 0.99999999999980993; 676.5203681218851; -1259.1392167224028;
771.32342877765313; -176.61502916214059; 12.507343278686905;
-0.13857109526572012; 9.9843695780195716e-6; 1.5056327351493116e-7;
|]
in
let z = z -. 1.0 in
let results = Array.fold_right
(fun x y -> x +. y)
(Array.mapi
(fun i x -> if i = 0 then x else x /. (z+.(float i)))
consts
)
0.0
in
let x = z +. (float (Array.length consts)) -. 1.5 in
let final = (sqrt (2.0*.pi)) *.
(x ** (z+.0.5)) *.
(exp (-.x)) *. result
in
final
let factorial_gamma n = int_of_float (gamma (float (n+1)))
Самый простой способ - это, вероятно, обернуть его в другую реализацию OutputStream
, которая пересылает все запросы на запись, но сохраняет внутренний счетчик. Тогда вы просто напишите вместо этого. Не должно быть слишком сложно реализовать - и действительно, он может быть уже.
РЕДАКТИРОВАТЬ: Просто угадав разумное имя ( CountingOutputStream
), мы получили реализацию в Apache Commons IO .
РЕДАКТИРОВАТЬ: Как отмечалось в другом месте, если это для HTTP и ваш клиент еще не выполняет буферизацию полных данных (в этом случае я бы подумал , это может решить проблему длина содержимого), у вас могут возникнуть проблемы из-за необходимости записать длину перед записью данных . В некоторых случаях вы можете обнаружить, что он будет работать до определенного размера (который буферизуется клиентом), а затем потерпит неудачу. В этом случае решения Дэвида будут подходящими.
The problem is that you must set the content length in the response header before you start writing any data to the output stream. So your options are:
Вы можете рассмотреть возможность записи в собственный ByteArrayOutputStream и сбросить его в выходной поток ответа в самом конце.