2014-12-04 4 views
-1

한 이중 숫자를 다른 이중 숫자로 매핑하는 기능의 속도를 높이려고합니다. 그러나 기능은 동일하게 유지되어야합니다. 똑같은 입력이 이전과 똑같은 출력을 만들어 내야합니다. 그 이유는이 원래 함수가 의심스러운 행동을하더라도 시스템에 어떤 차이점을 넣고 싶지 않기 때문입니다.이 이중 함수를 수행하는 더 빠른 방법을 찾으십시오.

기능은 다음과 같습니다

double g(double d) 
{ 
     std::stringstream ss; 
     ss.precision(10); 
     ss<<std::fixed<<d; 
     std::string asString; 
     ss >> asString; 
     return atof(asString.c_str()); 
} 

기능이 꽤 느린 보인다. 문자열을 통해 double을 다른 double로 변환하면 이상하게 보입니다.

+0

_ "기능이 매우 느립니다." 모든 측정 및 구체적인 프로파일 링? –

+0

글쎄요. 거의 같은 일을하는 함수가 있습니다. double d = static_cast (nint (d * tenbillion))/십억이지만 훨씬 빠릅니다. – steviekm3

+0

'std :: 엡실론 '과 같은 지정된 정밀도 내에서'double'을 비교하는 것은 어떻습니까? 아니면 특정 범위 내에서 작동하는 경우 고정 소수점 값을 사용합니까? –

답변

1

십진수 10 자리의 정밀도로 두 배를 얻는 더 쉬운 방법은 값에 pow(10, 10) 배 큰 숫자를 더한 다음 다시 빼는 것입니다. 좋아요 :

double n = pow(10, 10 + ((long) log(d)/log(10))); 
double truncated = d + n; 
return truncated - n; 
+0

내가 한 번 시도해 보자. 감사. – steviekm3

+1

문제는 이것이 부동 소수점의 땅이라는 것입니다. 그는 똑같은 출력을내는 버전을 요구합니다. 정확히 같은 출력을내는 것은 확실하지 않습니다. JUst는 원래 함수가 10 자리로 반올림한다는 것을 명확히 알지 못합니다. – pm100

+1

최종 답변은 단 1 자리 10 진수 (2 비트와 비슷하지만 10 진법을 다룰 때 측정하기가 어렵습니다) 일 뿐이지 만 사실입니다. – randomusername