3

나는 (큰) float 배열을 가졌으며, 각 float은 4 바이트를 차지합니다.고정 범위 float을 효율적으로 저장하는 방법

방법은 내 수레가 는 0과 255 사이 원거리 적은 4 바이트보다 의 각 플로트를 저장할 수 있다는 사실 주어진 있나요?

전체 배열에 대해 어느 정도의 계산을 수행 할 수 있습니다.

나는 (을)를 사용하고 있습니다.

답변

1

데이터의 절대 범위는 정말 문제가 많은, 당신이 필요로하는 정밀도의 양입니다하지 않습니다. 예를 들어 당신이 떠날 수 있다면. 6 자리의 정밀도라면, 1-1000000의 정수를 저장하는 데 필요한만큼의 저장소 만 있으면되며 20 비트입니다. 따라서 이것을 가정하면 다음을 할 수 있습니다.

1) 가장 작은 요소의 값이 0이되도록 데이터를 이동합니다. 모든 요소에서 단일 값을 뺍니다. 이 변화를 기록하십시오.

2) 데이터를 소수로 잘라내어 정수로 잘린 후에도 필요한 정밀도를 잃지 않도록하십시오.

3) 편리한 8 또는 16 비트 단위로 데이터를 압축 할 수있는 경우가 아니면 까다로운 문제 일 수 있습니다. 데이터를 연속되는 부호없는 정수로 묶어야합니다. 이 예제에서는 데이터 값 각각에 20 비트가 필요하므로 값 1은 정수 1의 처음 20 비트를 취하고 값 2는 정수 1의 나머지 12 비트와 정수 2의 처음 8 비트를 차지합니다. 이 가상의 경우 ~ 40 %를 절약하게됩니다.

4) 이제 '암호 해독'입니다. 값의 압축을 풀고 (각 비트 수를 저장 했음) un-scale, un-shift합니다.

이렇게하면 표준 압축 알고리즘보다 더 빠르고 압축 될 수 있습니다. 필요한 정밀도에 대한 가정을하지 않아도되지만 실제로는 그렇습니다.

+0

감사합니다. 주요 아이디어가 정밀도를 먼저 알아내는 것처럼 보입니다. – cojocar

+1

예, 그게 내가 생각하기에 시작과 끝입니다.그런 다음 * unsigned * 정수로 수행하는 '비트 패킹'을 확인하면 불필요하게 부호 비트가 복잡해질 수 있습니다. 또한, 당신의 절대 범위가 제한되어 있고 [가수는 23 비트 만 사용합니다] (http://en.wikipedia.org/wiki/File:IEEE_754_Single_Floating_Point_Format.svg) 이러한 종류의 기술을 통해 정밀도가 손실 될 수 있습니다. –

1

어느 정도의 정밀도가 필요합니까?

unsigned short (0 - 65,535 범위)로 표시하고 실제 값이 필요할 때 모든 값을 2^8으로 나누어 각 플로트를 2 바이트로 저장할 수 있습니다. 이것은 기본적으로 부동 소수점 대신 고정 소수점 형식을 사용하는 것과 같습니다.

이렇게하면 정확도가 1.0/(2^8) = 0.00390625으로 제한됩니다.

+0

나는 정밀도를 확실히 모른다. 나는 그것이 작동하는지보기 위해이 방법을 시도 할 것이다. 어쨌든, 아이디어를 주셔서 감사합니다 - 더 정밀도를 원한다면 3 바이트를 사용할 수 있지만 정렬 문제가 생길 것입니다. 어쩌면 정밀도의 손실없이 해결책이있을 수 있습니다. – cojocar

+1

참고로, 이것은 균일 한 배포에 적합합니다. 값이 0 인 경우, 더 많은 정밀도가 필요한 경우 [반 정밀도] (http://en.wikipedia.org/wiki/Half-precision_floating-point_format) 또는 3 비트의 사용자 정의 부동 소수점을 사용하여 멱지수. – Lyth

0

예를 들어, 정수 (.0)를 한 바이트에 저장할 수 있지만 다른 float에는 더 많은 바이트가 필요합니다.

당신은 정밀 걱정하지 않는 경우는 고정 소수점을 사용할 수

...