1

MSVC 릴리스 모드 및 디버그 모드에서 Double 처리에 대한 소수점 이하 자릿수 정밀도가 달라집니다.Double in 릴리스 모드/디버그 모드의 정밀도 차이

Ex - 참고 : - Double dataFilled; 1) 로그 (dataFilled) ==> I 릴리스 및 디버그에 다른 값을 받고있는 이유

Debug Mode dataFilled =96.1588665998339850 
Release Mode dataFilled =96.1588665998339420 

Intended value is 96.1588665998339850 

누군가가 나를 인도하시기 바랍니다 수 있습니다 #INCLUDE.

+2

[제공 코드] (http://stackoverflow.com/help/mcve) –

+0

릴리스 및 디버그 모드가 다른 할당자를 사용하기 때문에 이것이 가능할 수 있습니까? – mpacheco

답변

1

배정 밀도 부동 소수점 수의 IEEE 이진 표현은 15 개의 십진수 만 유효합니다. 당신은 18을 인쇄하고있다. 두 결과가 최하위 가수 (53)의 가수 값에 따라 다르게 보인다. 이러한 차이는 두 빌드 구성간에 작업 순서 또는 중간 결과 처리시의 차이로 인해 쉽게 발생할 수 있습니다.

당신이 정말로 요구하는만큼 정밀도가 필요하다면 임의 정밀도 수학 라이브러리를 조사해야 할 것입니다. 그렇지 않으면, 모든 기계가 있어야하는 것처럼 기계의 원시 부동 소수점 연산이 부정확하다는 것을 인정하십시오. 컴퓨터에서 극도로 정밀한 산술 연산을 수행하는 것은 많은 작업 일 수 있습니다.

대처 방안으로, VS는 디버그 빌드에서와 같이 Release 빌드에서 부동 소수점 처리를 설정하기 위해 설정할 수있는 빌드 옵션을 가질 수 있습니다 (성능상의 불이익이 적음). 하지만 그러한 옵션을 사용하는 것은 단지 붕대 일뿐입니다. 트릭없이 필요한 정밀도에 의존 할 수있는 전산 접근법을 사용해야합니다.

+0

그리고 이것이 자동화 된 테스트 인 경우 대부분의 경우 부동 소수점 계산의 정확한 값을 테스트하는 것은 잘못입니다. 대신 계산 결과가 예상 값의 허용 델타 내에 있는지 테스트해야합니다. –