Решение простой задачи

 

При первом запуске моего визуализатора гистограмм я попробовал построить распределение Коши с диапазоном значений от -10 до 10, и, конечно же, я получил график, практически аналогичный графику из моей позапрошлой статьи:

cauchywrong0

Выглядит он совершенно разумно; я решил, что мой код в порядке, ведь я крут!

Затем я попробовал построить график равномерного распределения в диапазоне от 0 до 1, но я забыл изменить сам запрос; и он все еще выдавал распределение Коши. Вот то же самое распределение Коши, но на этот раз от 0 до 1. О, что за…:

cauchyWrong

Это явно не распределение Коши. И очевидно: я не настолько крут, чтобы написать программу из двадцати строчек и не допустить в ней сразу же элементарную ошибку с плавающей запятой.

Ошибка, которая была не видна на первом графике, теперь очевидна: определение индекса для самого левого интервала является неверным. Почему? Потому что при преобразовании из double в int дробная часть просто отбрасывается, т.е. округляется в сторону нуля, причем округление происходит «в сторону нуля» и для отрицательных чисел. Это значит, что в самый левый интервал содержал все значения, предназначенные ему, а также все, что должно было попасть в интервал, правее от него! Решение заключается в округлении значения до его преобразования к int или в проверке величины double до обрезания его к int, а не после.

Оригинал статьи