Короче говоря - вы не можете работать со значениями с плавающей запятой на ПК, как в реальной жизни.Всегда будут потери точности и ошибки округления из-за ограниченного объема памяти, используемой для хранения значений в очень широких диапазонах.
Всегда проверяйте равенство с некоторыми эпсилонами, которые могут составлять половину шага между рабочими значениями, например 0,1:
IsEqual(0.1, 0.2, 0.05) = false
IsEqual(0.1, 0.1001, 0.05) = true
IsEqual(0.1, 0.1499, 0.05) = true
или лучшая точность в заданном масштабе и заданном формате с плавающей запятой (например, 64-битный формат имеет меньше эпсилона, чем 32-битный) (вам может потребоваться проверить на вашем языке способы получения этого значения):
IsEqual(0.1, 0.2, BestPrecisionAt(0.1)) = false
IsEqual(0.1, 0.1001, BestPrecisionAt(0.1)) = false
IsEqual(0.1, 0.1499, BestPrecisionAt(0.1)) = false
IsEqual(0.1, 0.1000001, BestPrecisionAt(0.1)) = true
//Where for example BestPrecisionAt(0.1) could be 0.00001
РЕДАКТИРОВАТЬ: Вы ничего не сказали об ошибках, которые у вас есть.Так что же не так с 0.1?Я могу только предположить, что ваш временной шаг не является достаточно точным, скорости ваших объектов позволяют им проходить друг через друга между проверками столкновений.Это верно?Если да - вы должны увеличить разрешение временного шага и / или проверить наличие коллизий раньше.