2013-07-18 1 views
0

나는 내 케이크를 원하고 그것을 먹는다. 나는 다른 계산의 정확성을 손상시키지 않으면 서 가능한 한 가장 큰 범위까지 숫자를 아름답게 (둥글게) 만들고 싶습니다. C#에서 double을 사용하고 있습니다 (일부 문자열 변환 조작도 있음).잘못된 숫자를 적절히 반올림하여 '미화'번호

여기에 문제가 있습니다. 이중 숫자 표현의 고유 한 제한 사항을 이해합니다 (설명하지 마십시오). 그러나 최종 사용자에게 미적으로 기분 좋게 보이기 위해 어떤 식 으로든 숫자를 반올림하고 싶습니다 (저는 계산기를 만들고 있습니다). 문제는 한 자리에서 X 유효 숫자로 반올림하지만 다른 한 자리에서는 반올림합니다. 반면에 소수 자리로 반올림하는 것은 다른 경우에는 작동하지만 첫 번째 경우에서는 작동하지 않습니다.

지키

사례 A :에서는, Math.sin (Math.PI로) = 0.000000000000000122460635382238

CASE B : 첫 번째 경우에 대해 0.000000000000001/3 = 0.000000000000000333333333333333

, I 진수로 라운드 할 장소. 그것은 내가 찾고있는 멋진 깔끔한 제로를 줄 것입니다. 시그 (SIG) 자릿수로 반올림하면 잘못된 자릿수도 계속 유지하게됩니다.

그러나 두 번째 경우에 소수점 이하를 반올림하면 엄청난 정확성을 잃어 버리게되므로 중요한 디지트로 둥글어야합니다.

두 가지 계산 유형 모두를 수용 할 수있는 일반적인 방법이 있습니까?

+0

에 포기하기 때문에 나는 당신이 배우에 대한 이동 제안 과학적 표기법. 이런 종류의 수학을 사용하는 모든 사용자는 그것을 알게 될 것이며,이 엄청나게 큰 숫자와 작은 숫자를 의도 한 것입니다. – Logarr

+0

과학 표기법에 대해 알고 있습니다. 나는이 같은 완전한 숫자 표현을 사용하여 문제를보고 생각하는 것이 틀림없이 더 간단하게 만들었습니다. –

+0

"그게 내게 멋진 제로를 줄거야." - 과학 표기법의 범위에서 문제는 생각하지 않습니다. 서식 문제는 매우 간단합니다. SN으로 변환 한 다음 소수 자리를 기준으로 표준 반올림을 수행해야합니다. 기본적으로 내가 말하는 것은 계산기를 다시 발명하려고 시도하지 않는 것입니다. – Logarr

답변

1

결과 자체에이를 수행하는 것이 가능하지 않으며 정밀도와 관련이 없다고 생각합니다.

이 입력을 고려하십시오 : (1+3)/2^3. 결과를 sin(30) 또는 cos(60) 또는 1/2으로 표시하고 다른 많은 해석을 사용하여 "미화"할 수 있습니다. 잘못된 "미화"를 선택하면 사용자가 자신의 기능에 sin(x)과 관련이 있다고 생각하게하여 사용자를 오도 할 수 있습니다.

계산기가 모든 초기 입력을 변수로 유지한다면 결과가 필요할 때까지 모든 작업을 연기 한 다음 요구 사항이 충족 될 때까지 결과를 단순화해야합니다. 또한 합리적인 수, e, Pi 및 다른 비합리적인 수를 사용하는 것이 고려하기 쉽지 않을 수도 있습니다.

+0

나는 calc에 Pi가 있는지, 아니면 e가 있는지를 확인하고 그에 따라 행동 할 필요가 있다고 생각한다. exponents, 초월 수, 0이 많이있는 작은 숫자, 그리고 그 곳곳에 날아 다니는 trig와 관련된 더 많은 계산을 위해, 나는 이것이 정말로 정말로 엉망인 것을 볼 수 있습니다 : ( –

+0

"messy"라고 말하지 않겠습니다. "거의 불가능한"일을 바로 잡을 수 있습니다. 그러면 완료 될 때까지 소프트웨어를 $ 1000/상자에 팔아야합니다. –

+0

와우, 그게 그렇게 힘들지는 몰랐습니다. 이런 종류의 일에 대처할 수있는 것이 있다면 궁금합니다. –

1

가장 좋은 해결책은 계산 중에 얻을 수있는 모든 비트를 유지하고 최종 사용자에게 디스플레이 형식을 그대로 두는 것입니다. 사용자는 계산의 특성과 결과의 사용 모두를 고려할 때 얼마나 많은 유효 자릿수가 자신의 상황에서 의미가 있는지 알 수 있어야합니다.

내부적으로 사용하는 부동 소수점 형식의 몇 가지 계산에 대해 합당한 수의 유효 숫자를 기본값으로 지정합니다. 이중 값을 사용하는 경우 약 12 ​​자입니다. 사용자가 형식을 변경하면 즉시 새 형식으로 다시 표시됩니다.

+0

자동으로 결정되기를 원합니다. 상황에 따라 예를 들어, 사용자가 8 시그 자릿수를 선택하면 B 경우에 대해 0.00000000000000033333333이됩니다. 그러나 사례 A는 0.00000000000000012246064가 될 것이고, 결과는 0이되기 때문에 나쁘다. 내가 합계의 유형에 따라, 사용자가 SD와 DP를 사용하는 것을 끊임없이 전환하기를 원하지 않는다. –

+0

항상 사용자가 0이 아닌 것으로 취급 할 수있는 가장 작은 크기를 지정할 수 있습니다. –

1

가장 좋은 해결책은 임의 정밀도 산술을 사용하는 것이지만 훨씬 복잡한 코드와 느린 속도가 발생합니다. 그래서 좋은 거래는 decimal floating point을 사용하고 있습니다. 더 나은 결과를 얻으려면 45도 배수의 사인/코사인과 같은 일부 에지 케이스를 감지하여 정확한 결과를 직접 반환하십시오.

편집 : 좋은 해결책을 찾았지만 시도 할 기회가 없었습니다.

여기에 제가 생각하지 못한 이유가 있습니다. 좋은 이유는 : 부동 소수점 숫자를 텍스트 문자열로 표현하는 방법은 무엇입니까? 이것은 놀랍게도 까다로운 문제이지만, 1990 년 이후로 근본적으로 해결 된 것으로 간주되어 왔습니다.

Steele and White의 전에는 printf 및 유사한 렌더링 기능 구현이 부동 소수점 숫자를 렌더링하는 데 가장 좋았지 만 다양한 차이가있었습니다 그들이 얼마나 잘 행동했는지. 예를 들어, 1.3과 같은 숫자는 1.29999999로 렌더링 될 수 있습니다. 또는 숫자가 쓰여지고 작성된 표현이 다시 읽히는 피드백 루프를 통해 입력되면 각 연속 결과는 원본에서 더 멀리 떨어져 더 멀리 이동할 수 있습니다.

은 ... 2010 년

, 플로리안 Loitsch 20 년 동안이 분야에서 가장 큰 단계를 나타냅니다 PLDI, "Printing floating-point numbers quickly and accurately with integers"에서 멋진 종이, 출판 : 그는 대부분 정확한 렌더링을 수행하는 기계 정수를 사용하는 방법을 알아 냈어 ! "대부분"이라고 말하는 이유는 무엇입니까? Loitsch의 "Grisu3"알고리즘은 매우 빠르고하지만, 당신이 Dragon4으로 폴백 할 필요가있는 경우에 숫자의 약 0.5 %, 또는 파생

http://www.serpentine.com/blog/2011/06/29/here-be-dragons-advances-in-problems-you-didnt-even-know-you-had/

관련 문제