2012-09-11 3 views
3

.Net 문자열 포맷터를 사용하여 최소한 하나의 유효 숫자를 표시하는 최소 정밀도 자릿수를 찾는 알고리즘을 작성하려고합니다.최소 정밀도 찾기

예 :

Value  Precision wanted: 
-----  ----------------- 
10   0 
1   0 
0.1  1 
0.99  1 
0.01  2 
0.009  3 

을 (따라서 0.99은 (1)의 정밀도를 필요로, 첫 번째, 더 숫자에 대한 상관 없어) 내가 가지고 올 수있는 최선은 다음과 같습니다

int precision = (int)Math.Abs(Math.Min(0, Math.Floor(Math.Log10(value)))); 

이것은 정상적으로 작동하지만 좀 더 우아한 해결책이 있다고 생각할 수는 없습니다. 어떤 수학 전문가가 나를 도울 수 있습니까?

+0

"더 간단한"해결책은 아마도 IEEE 부동 소수점 표현을 활용할 것입니다. –

+1

NB 0.99는 중요한 숫자로 반올림되어 0.9가 아니며, 1입니다. -이 점에 유의하든 그렇지 않든 확실하지 않습니다. – Rawling

+0

@Rawling 언급했으나 실제로 가치 감사를 표시하지는 않습니다. – GazTheDestroyer

답변

3

약간 짧다

int precision = (int)Math.Max(0, -Math.Floor(Math.Log10(value))); 
1

플로트는 분수 값의 이진 표현이다. 초기 값은 부동 소수점 숫자로 단일 정밀도 경우, 수는 지수가 당신이 돌아갈 것이라고 말했다 것을 기반으로, 음이 아닌 경우

((f & 0x7f800000) >> 23)-127 . 

, 값을 얻기 위해 지수를 곱하여 0 (소수점 앞에 숫자가 있음).

지수가 음수이면 음수는 2 진수가 10 진수와 잘 맞지 않으므로 귀찮습니다. 그래도 테이블을 조회 할 수 있어야합니다. https://math.stackexchange.com/questions/3987/how-to-calculate-the-number-of-decimal-digits-for-a-binary-number#4080을 확인하십시오.

편집 : 부동 소수점 숫자가 저장되는 방식에 대해 읽어야합니다.