После запуска вашего кода, если вы делаете:
> compare a.[19] max;;
val it : int = -1
Это означает, что max больше, чем a. [19]
Если мы выполняем вычисления таким же образом, как оператор диапазона, но группируем двумя различными способами, а затем сравниваем их:
> compare (21.5+dl+dl+dl+dl+dl+dl+dl+dl) ((21.5+dl)+(dl+dl+dl+dl+dl+dl+dl));;
val it : int = 0
> compare (21.5+dl+dl+dl+dl+dl+dl+dl+dl+dl) ((21.5+dl)+(dl+dl+dl+dl+dl+dl+dl+dl));;
val it : int = -1
В этом примере вы можете увидеть, как добавление 7 раз одного и того же значения в другом порядке приводит к абсолютно одинаковому значению, но если мы попробуем это 8 раз, результат изменится в зависимости от группировки.
Вы делаете это 20 раз.
Так что, если вы используете оператор диапазона с плавающей точкой, вы должны знать о проблеме точности.
Но то же самое относится и к любым другим вычислениям с плавающей точкой.