문제

나는 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

/요한

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top