Добавляя к ответ Гонсолы , не забывайте, что Лисп предоставляет целые числа и рациональные числа бесконечной точности, в то время как C # любит усекать. Чтобы получить сравнимые (хотя и не идентичные) результаты, вам нужно будет разыграть 'nbad' и 'ngood', чтобы получить плавающие результаты.
Вы также можете поместить всю конвертированную программу в отмеченный регион. C # даже не предупреждает о переполнении fixnum - первое приближение будет относиться к переполнению, как будто вы ограничены в памяти (в Lisp, если переполнение дает слишком большое число, чтобы поместиться в оставшейся памяти, результаты аналогичного поведения).
checked {
var fbad = (double)nbad;
var fgood = (double)ngood;
var g = 2 * (gethash(word, good) | 0);
var b = gethash(word, bad) | 0;
if( (g + b) >= 5)
{
return Math.Max(
0.01,
Math.Min(0.99,
Math.Min(1, b / fbad) /
(Math.Min(1, g / fgood) + Math.Min(1, b / fbad))));
}
}