2010-02-11 4 views
1

다음은 내가 수행중인 일부 수학을위한 테스트 코드입니다.C# 수치 오류 드라이브 미친

왜 C#이 다르게 처리됩니까?

EXCEL

분자 = -0.161361101510599 * 10000000 분모 = = (- 1 * (100-81.26)) * (100분의 10,000,000)

+0

나는 또한 십진법을 시도했다 - 아무런 차이가 없음 –

+2

LOL, 엑셀, 정확하게 같은 문장에 맞지 않는다. 정확한 산술을 원한다면, 부동 소수점이 아닌 rationalals를 사용하자. – leppie

+1

"내가 Excel에서 이것을하면"이라고 말하면서 분명히 할 수 있습니다 : * Excel * 또는 * VBA *를 언급합니까? 그들은 그들의 기능 중 일부와 다르게 행동합니다. –

답변

3

귀하의 문제는 당신이 초기 Excel에서 다른 공급되는 값을 C# 코드에 추가하십시오. 당신이 어떻게 그것들이 같을 것이라고 기대합니까?

IOW : 0.161361101510599 != 0.161361102

+0

와우. 나는 그 하나를 놓쳤다! – xan

+0

Ok - 같은 번호로 이제 0.8610517689999946638207043757M이되고 0.861051769000이 아닌 –

+1

이 문맥에서 IOW는 "Isle of Wight"또는 "I Own Wool"이 아닌 "다른 말로하면"을 의미합니다 – bobobobo

4

이 가장 가능성이 때문에 번호가 C#을 대 엑셀에 표시되는 방법. 반올림 오류/차이점은 다른 플랫폼이나 다른 소프트웨어를 사용하여 고도의 정확성을 부여 할 때 일반적입니다.

편집 : 물론 처음부터 다른 숫자가 입력 되었기 때문일 수 있습니다. 복잡한 답을 찾아 나를 찾아라!

프로그래머는 큰 그림을 놓치고 뻔한 (잘 - 나는 ... ...) 사례를 간과하는 것으로 유명합니다!

+0

Hehe +1 for honesty :) – leppie

+0

음, 알고리즘 작성 오류 분석 소프트웨어가 수를 수동으로 비교하는 것보다 쉽다는 것은 널리 알려져 있습니다. 우리는 모두 프로그래머입니다. 번호 계산은 컴퓨터 운영자를 대상으로합니다. (단지 안전하기를 바란다 : 냉소적 인 것이었다.) – zendar

4

다른 답변에 대한 의견을 듣고 결과 (0.8610517689999946638207043757m)를 얻고 있다고 말합니다. 당신이 그렇게처럼 둥글게 경우

Math.Round(0.8610517689999946638207043757m, 12); 

그것은 출력 : 숫자 컴퓨팅 신뢰 엑셀 작업을 우리의 0861051769000

2

많지 않습니다 올바르게 2 개 1 자리 숫자를 추가합니다. Mathematica에서 계산을 실행하여 각 분수를 0으로 오른쪽으로 확장하여 64 자리를 제공했습니다. 결과는 다음과 같습니다.

0.861051771611526147278548559231590181430096051227321237993596585 

이 경우 Excel이 아닌 C#으로 이동하십시오. 그리고 두 번째와 세 번째 생각에서, 모든 경우에 숫자 컴퓨팅에 대한 부적합 성이 널리 알려져 있고 잘 설명되어있는 Excel이 아닌 C#으로 이동하십시오.

+0

Excel은 일반적으로 꽤 높은 수준의 정밀도를 가지고 있으며, IIRC는 'double', 아마도 96/128-bit보다 낫다. – leppie

+0

Excel에서 숫자 p-o-v의 실제 문제는 IEEE 산술이나 합리적인 수퍼 집합을 구현하지 않는 것입니다. 컴퓨터에서 실제 (실제 및 실제) 산술 연산을 수행하려는 불미스러운 점을 숨기기 위해 설계된 것 같습니다. 이것은 목표 청중에 매우 잘 맞을 수 있지만, 적절한 숫자 계산을하기 위해서는 그것을 풀어내는 것이 좌절감을 느낄 수 있습니다. –

1

다른주의 사항; 아마도 연산의 수를 줄이기 위해 산술 연산을 단순화해야 할 것입니다. 일반적으로 (항상 그런 것은 아님) f.p.에서 더 나은 결과를 얻을 수 있습니다. 산수.

val = noiseTerm/(81.26/100 - 1) 

는 수학적 방정식에 해당하며, 특히 사용자의 제 반대로 상기 scalingFactor 완전히 제산 3 개 동작을 포함하므로 전혀 필요하지 않다.

1

우선, 대부분의 경우 Excel에서는 C#처럼 기본 연산에 배정 밀도 부동 소수점 연산을 사용합니다.

특정 경우에 따라 C# 코드가 Excel 수식과 일치하지 않습니다. Excel 공식을 사용하는이 C# 코드를 사용해보십시오.

static void Calc() 
    { 
     double numerator = -0.161361101510599 * 10000000.0; 
     double denominator = (-1.0 * (100.0 - 81.26)) * (10000000.0/100.0); 
     double result = numerator/denominator; 
     Console.WriteLine("result={0}", result); 
    } 

출력을 실행하고 출력이 0.861051768999995임을 확인하십시오.

이제 사용자 지정 숫자 형식이 "0.00000000000000000"인 Excel에서 결과의 서식을 지정하면 Excel에서 C#과 동일한 결과를 얻게됩니다. 기본적으로 Excel에서는이 숫자를 12 자리의 유효 자릿수로 반올림하는 "일반"형식을 사용합니다. 위의 형식으로 변경하면 Excel에서 15 자리의 정밀도 (Excel에서 숫자를 표시하는 데 사용하는 최대 유효 자릿수)를 표시하도록합니다 (내부적으로 C# 이중 형식과 마찬가지로 15 자리 숫자의 정밀도가 있음) . 다음과 같은 코드을 실행하여 (대신 15 중요한 자리로 반올림) 유효 숫자를 15 + 표시하는 C#을 강제 할 수

는 :

static void Calc() 
    { 
     double numerator = -0.161361101510599 * 10000000.0; 
     double denominator = (-1.0 * (100.0 - 81.26)) * (10000000.0/100.0); 
     double result = numerator/denominator; 
     Console.WriteLine("result={0:R}", result); 
    } 

이 코드를 출력 0.8610517689999948는 ...하지만 AFAIK 방법이 없습니다 Excel에서 15 자리 이상을 표시하도록합니다.