문제
나는 c에서 다음과 같은 의사 코드를 구현하기 위해 노력하고 있습니다.
delay = ROUND(64*(floatDelay - intDelay))
where intDelay = (int) floatDelay
FloatDelay는 항상 긍정적입니다. Math.h의 라운드 기능을 사용하는 데 이점이 있습니까?
#inlcude <math.h>
delay=(int) round(64*(floatDelay-intDelay));
또는 사용할 수 있습니까 :
delay=(int)(64*(floatDelay - intDelay) + 0.5))
해결책
플로팅 포인트 번호를 다룰 때는 항상 적절한 수학 리브를 사용해야합니다. 플로트는 실제 값의 매우 근사치 일 수 있으며, 이로 인해 이상 함이 발생할 수 있습니다.
예를 들어, 5F는 4.9999999999999999999999999999999999999999999999999999999999999 곳 사이의 직접 캐스트를 시도 할 수 있습니다.
왜 깊이있는 이유를 보려면, 당신은 Wikipedia에서 부동 소수점 번호를 찾아야합니다. 그러나 간단히 말해서 숫자를 INT와 같은 직선 비트로 저장하는 대신 두 부분으로 저장됩니다. 플로트의 최종 값이 분수 * (기본 지수) 인 "분수"와 지수가 있습니다.
다른 팁
int에 대한 캐스트가 다른 프로그래머에게는 즉시 분명하지 않을 수 있다는 사실 외에는 내가 아는 장점이 없습니다.
둥근 함수를 사용하면 의도가 분명합니다.
어느 쪽이든 괜찮습니다 floatDelay
긍정적입니다.
하나는 벤치마킹이 없는지 말하기는 어렵지만 하나는 다른 것보다 약간 빠를 수 있습니다. round()
컴파일러 고유로 구현 될 수 있습니다. 속도 차이가 압도적으로 중요하지 않을 가능성이 훨씬 높으므로 더 명확하다고 느끼는 것을 사용하십시오.
나는 "찾았다"C ++에서 소수점 값을 잘라냅니다"부동 소수점 번호에 대한 유용한 토론을 제공했습니다.
특히 Greg Hewgill은 다음 링크를 제공했습니다. 모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 것 David Goldberg
예를 들어, 5F는 4.9999999999999999999999999999999999999999999999999999999999999 곳 사이의 직접 캐스트를 시도 할 수 있습니다.
이것이 정말로 사실입니까?
int에 자르기 전에 0.5를 추가하는지 확인하면
실제로 4.9999 문제입니다.
내 말 : 4.9999+0.5 = 5.4999-> 5
/요한