Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

Функция Random в fpc-2.4.0. по linuxом

Страницы: 1
Функция Random в fpc-2.4.0. по linuxом
может я недосыпаю, но почему-то показалось что в fpc-2.4.0.x86_64-linux функция Random генерирует случайное число из (0;1], тогда как обычно принято из [0;1), или я ошибаюсь?
свободный страннык
с чего вы делаете такой вывод?

Я вот вижу, что в ф-ции random: extended число типа cardinal (макс. значение $FFFFFFFF) делится на (1 shl 32), что на единицу больше, поэтому результат не может быть равен единице.
пока ты не доволен жизнью - она проходит...
Как известно, функция ln не определена в нуле.

При достаточно большом количестве итераций в строке ln(1-Random) или ln(Random) появляется «Runtime error 200». Из чего можно сделать вывод, что Random включает как 0 так и 1.

Однако, дело может быть и в типе переменных. Например, Random – Extended, а ln пределена для Single
свободный страннык
Код
var
  sm: cardinal;
  l: extended;
begin
  // максимальное 32-битное беззнаковое
  sm := $FFFFFFFF;
  // делаем то же, что и ф-ция random: extended
  l := sm * (extended(1.0)/(int64(1) shl 32));
  writeln(1-l);
  writeln(ln(1-l));
end.

выдает:
2.3283064365386963E-0010
-2.2180709777918250E+0001
т.е. вроде как все в ожидаемых пределах, только на компиляторе 2.5.1 из svn
покажи свой код, попробуем разобраться.
пока ты не доволен жизнью - она проходит...
Выяснил, что проблема в несогласованности типа переменных. Действительно, function ln(d: double) : double, a function Random : extended. Поэтому в ln(1-Random) под ln может оказаться ноль в «double измерении»
свободный страннык
попробуйте как один из вариантов выхода поставить проверку на ноль. Может это не оптимальный выход, но вроде должно заработать.
пока ты не доволен жизнью - она проходит...
если бы extended превращались в double, проблема вроде не должна возникать, но поскольку этого не происходит получается проблема
a9d, проверку сделал вроде всё норм, работает
свободный страннык
Ну вот, оказывается все уже давным-давно исправлено, проблема существовала со времен 2.2.4, только исправление почему-то не попало в релиз 2.4.0. Думаю это всё объясняет, я тестировал на 2.5.1 поэтому у меня и работало нормально.
пока ты не доволен жизнью - она проходит...
a9d, большое спасибо за помощь, действительно всё в точности как вы описали, исправил свою программу теперь всё работает в лучшем виде
свободный страннык
Страницы: 1
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)