대부분의 피직스 엔진은 객체의 궤도를 얼마나 멀리 밟았는지 나타내는 0.0에서 1.0 사이의 인수를 반환하는 객체 궤도 추적을 지원합니다.과소 평가 된 부동 소수점 인수
내가 염려하는 문제는 그 궤적의 요인에 의해 객체를 움직이면 그 위치가 히트하고 멈추기로되어 있던 경계를 지나가는 경우입니다 (부동 소수점 올림 때문에).
예를 들어,이 문제가 발생할 때까지 무작위로 시도한 C 프로그램을 만들었습니다. (나는 극단적 인 움직임이 적은 것들을 경험했지만, 큰 부동 소수점에만 국한되지는 않습니다.) :
는float start = 4884361.0f;
float wall = 37961976.0f;
float end = 1398674432.0f;
float time = (wall - start)/(end - start);
float new_pos = start + time * (end - start);
printf("We hit %f, but moving left us at %f.\n", wall, new_pos);
그리고이 경우는 출력한다 :
We hit 37961976.000000, but moving left us at 37961980.000000.
그래서 위치가 벽 위치를 넘어 이동 지금은 객체가 벽 안에 갇혀있다.
계수를 생성하거나 부동 소수점 오류가 항상 모든 가능한 값의 실제 값을 언더 슈팅하도록 요소 승수를 수행하는 방법이 있습니까?
부동 소수점 동작을 변경하는 대신 new_pos를 계산할 때 한계를 고려하는 래퍼 함수 만 작성하는 것이 좋습니다. wrapper 내부에서, 여러분은 심지어 "double"으로 승진 할 수 있고 더 큰 정밀도로 에러를 볼 수 있습니다. – cklin
의역을 말하자면 반올림 오류가 정확한 값보다 높지는 않은지 확인하고 싶습니까? –
@cklink : 실제로 '시간'은 벽이 축과 정렬되지 않았기 때문에 정상 투영에 의해 계산되므로 가능하지 않을 수 있습니다. 따라서 new_pos를 계산할 때 위치 제한에 대한 실질적인 개념은 없습니다 '. – Jengerer