2011-12-15 7 views
4

Microsoft Visual C++ 6.0으로 작성된 응용 프로그램이 있습니다. 이제 Visual Studio 2010에서 C#을 사용하여 응용 프로그램을 다시 작성했지만 정밀도 문제로 인해 결과가 일치하지 않습니다. 이러한 정밀도 문제 중 하나는 다음과 같습니다.Visual Studio 2010의 정밀 문제

float a = 1.0f; 

float b = 3.0f; 

float c = a/b; 

이 비주얼 스튜디오 2010에서 실행 C# 코드는 c 값 = 0.333333343

그러나 실행 값 정의에있는 값 뒤에 F를 제거 같은 코드, 비주얼 C++ 6.0 C 값을 제공 준다 = 0.333333.

아무도 그것을 정렬하고 Visual C++ 6.0뿐만 아니라 Visual Studio에서도 c와 동일한 값을 갖는 방법을 설명 할 수 있습니까 ??


실제로 값은 조사 식 창에서 가져옵니다. Visual Studio의 다른 버전이 부동 소수점 형식 표현과 다를 수 있음을 알게되었습니다. 따라서 시계의 가치가 유용하지 않을 수 있습니다. 이것이 내가 두 비주얼 스튜디오 버전에서 값을 출력 한 이유이며 그 결과는 다음과 같습니다. 비주얼 스튜디오 6.0 Visual C++를 사용하여 언어 그 것이다 0.333333 (여섯 3의)

하지만 비주얼 스튜디오 10는 C# 언어를 사용하여 그 것이다 0.3333333 (일곱 3의)

그래서 누구에 내 C# 프로그램을 만들기 위해 나를 도울 수 비주얼 C++과 같은 결과를 낳는다 ??? (즉, 두 버전 모두에서 동일한 결과를 생성하는 플로팅 작업을 수행 할 수 있습니까?)

+2

당신은 값을 어떻게보고 있습니까? 내부 표현은 (실수로 C#이 장면 뒤에서'double '을 사용하지 않는 한) 동일하지만 사용자에게 숫자를 표시하는 방법이 다르므로 다른 표시 기본값을 쉽게 볼 수 있습니다. –

+0

@MrLister는 C# 4.0 사양에서 4.1.6 절에서 "float에서 이진 연산은"* 적어도 "float"범위와 정밀도 "(강조가 추가됨)를 사용하여 수행됩니다. 따라서 배후의 정밀도는 구현에 따라 결정됩니다. .NET Framework에서는 배후에서 배수를 사용할 수 있습니다. – phoog

답변

15

정확한 값은 0.3이며, 둘 다 "정확합니다"라고 가정하면 - 및 시도하는 경우 정확히 이진 부동 소수점 계산의 결과는 일반적으로 작동하는 방식으로 시작하는 것은 좋지 않습니다. (일부 자세한 내용은 binary floating point in .NET에 나의 기사를 참조하십시오.)

그것은 당신이 첫번째 장소에있는 이진 부동 포인트를 사용하지 않아야 이다 (예를 들어, 당신의 가치를 정확히 표현하면, 같은 돈 인공 양). 또는 특정 허용 오차와 동등한 비교 만 수행해야 할 수도 있습니다.

또한 C# 및 C는 동일한 비트 패턴을 생산하는 것이 가능 -하지만 당신이 있기 때문에 그 값이 를 포맷하는 방법의 다른 결과를보고있다. 다시 말하지만, 비교를 위해 숫자의 텍스트 표현을 사용하지 않을 것입니다.

+0

Visual C++에서 0.333333 (6 3)을 제공하고 C#에서 0.3333333 (7 3)을 제공하는 두 값을 모두 인쇄했습니다. 즉, 오류가 있음을 의미합니다. 어떻게 Visual C++ 6.0과 Visual Studio 10을 C#으로 만들면 같은 결과가 나옵니까 ?? – Mahesh

+0

@Mahesh : 아니요, 오류가 있음을 의미하지 않습니다. 나는 그것이 각각의 경우에 관련된 텍스트를 찾는 것에 불과하다고 생각한다. –

5

C#은 단순히 소수점 이하를 표시합니다. 0.333333343은 6 자릿수로 반올림하여 0.333333입니다. 기본 값은 c입니다.

물론 정확도를 높이려면 항상 double 개의 변수를 사용할 수 있습니다.

3

C# 부동 소수점은 floatdouble 유형으로 처리 할 수 ​​있습니다. A float 타입의 정밀도는 7 자리이며, double입니다.

저는 C++ 표준 정밀도가 약 16 자리 (평균 15.9)라고 생각합니다.

어쨌든 1/3은 0.333 되풀이되지 않으므로 어느 표현도 산술적으로 정확하지 않습니다.

나는 단지 당신이보고있는 값의 표현이라고 생각한다. (디버거가 값을 표시하기위한 문자열로 변환한다는 것을 명심해야한다.) 각각의 메모리 위치를 확인한다면 아마 값

1

신속한 확인 결과 예는 숫자가 정확히 동일합니다. 따라서 귀하의 질문에 대한 대답은 동일한 출력을 원할 때 디스플레이 방법이 호환 가능한지 확인하는 것입니다 .
예를 들어 C가 printf("%9.7f", result)이고 C#이 string.Format("{0:0.0000000}", result)입니다. 그게 전부입니다.