문제

0, 1]의 범위에 플로트가 있고 서명되지 않은 바이트에 정량화하고 저장하고 싶습니다. 쉬운 소리처럼 들리지만 실제로는 매우 복잡합니다.

명백한 솔루션은 다음과 같습니다.

unsigned char QuantizeFloat(float a)
{
  return (unsigned char)(a * 255.0f);
}

이것은 지금까지 0에서 255까지의 모든 숫자를 얻지 만 정수의 분포는조차 없습니다. 함수는 반환됩니다 255 A가 정확히 있다면 1.0f. 좋은 해결책이 아닙니다.

올바른 반올림을하면 문제를 바꿉니다.

unsigned char QuantizeFloat(float a)
{
  return (unsigned char)(a * 255.0f + 0.5f);
}

여기서 결과 0 다른 숫자보다 플로트 범위의 절반 만 커버합니다.

부동 소수점 범위의 동일한 분포로 양자화를 어떻게합니까? 이상적으로는 똑같이 분포 된 임의의 플로트를 정량화하면 정수의 동일한 분포를 얻고 싶습니다.

어떤 아이디어?


BTW : 또한 내 코드는 C에 있습니다. 문제는 언어에 대한 언어입니다. C가 아닌 사람들에게 : 그냥 가정 해보세요 float 에게 int 변환은 플로트를 잘립니다.

편집하다: 우리는 여기서 약간의 혼란을 겪었 기 때문에 : 가장 작은 입력 플로트 (0)를 가장 작은 설계되지 않은 숯에 맵핑하고 가장 높은 범위 (1.0f)를 가장 높은 서명되지 않은 바이트 (255)로 매핑해야합니다.

도움이 되었습니까?

해결책

어때 a * 256f 256 ~ 255를 줄이는 점검으로? 그래서 :

return (unsigned char) (min(255, (int) (a * 256f)));

(플랫폼에서 적절한 최소 기능의 경우 - C 함수를 기억할 수 없습니다.)

기본적으로 범위를 256 동일한 부분으로 나누고 싶습니다. 이것이해야 할 일입니다. 1.0이 256으로 이동하고 반올림이 필요한 가장자리 케이스는 도메인이 양쪽 끝에 포함되기 때문입니다.

다른 팁

나는 당신이 찾고있는 것이 이것이라고 생각합니다.

unsigned char QuantizeFloat (float a)
{
  return (unsigned char) (a * 256.0f);
}

이것은 [0, 1]의 균일 플로트 값을 [0, 255]의 균일 바이트 값에 매핑합니다. [I/256, (i+1)/256 [(I+1)/256)의 모든 값은 0..255의 I에 대해 i에 매핑됩니다. 바람직하지 않은 것은 1.0F가 256.0F에 매핑되어 0으로 감싸는 것입니다.

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