2016-08-21 8 views
1

현재 고정밀 부동 소수점을 필요로하는 소프트웨어를 프로그래밍 중입니다. 때로는 double보다 정확한 정밀도가 필요합니다. 고전적인 부동 소수점 숫자가 한정된 양의 정밀도를 달성 할 수있는 이유를 알고 있습니다.고정밀 부동 소수점에 문자열을 사용할 수 있습니까?

나는이 문제에 대해 생각하고 있었고 숫자를 표현하고 계산할 때 string을 사용하는 아이디어가있었습니다. 우리 모두가 (단지 부동 소수점 포함) 초등학교에서 배운 것처럼

string number_one = "12.3459233547343432"; 
string number_two = "738.67632487523747384"; 

string sum = sum_strings(number_one, number_two); 

cout << sum << endl; // 751.0222482299717... 

기능 sum_strings 다음 추가를 수행 할 것입니다 :

enter image description here

빼기가 같은 방식으로 작동합니다. 곱셈과 나눗셈은 더 복잡 할 것이지만 역시 효과적입니다.

필자는 이론적으로 (문자열을 저장할 충분한 RAM으로) 필요한만큼 높은 정밀도를 얻을 수 있다고 생각합니다.

내 질문은 :

  1. 이 기술은 (~ 10 개 분수 자리에) 훨씬 느린 것입니까?
  2. 이미 사용되고 있으며이를 구현하는 라이브러리가 있습니까?
+0

부동 소수점 에뮬레이션이라고하며 부동 소수점 계산은 일반적으로 원자 CPU 쉼표이므로 매우 느립니다. 에뮬레이션은 수십 개의 CPU 명령을 취할 수 있습니다. –

+1

소수 자릿수 10 개가 아니라 유효 숫자 10 개를 의미한다고 가정하면 (그 정보는 실제로 질문과 관련이 없습니다), '이중'은 필요한 정보를 정확하게 저장하기에 충분합니다. 그렇다면 다시, 당신의 산문은 실제 예와 일치하지 않습니다. –

+0

'3'은 '3'과 같지 않고 '2'는 '2'와 같지 않기 때문에 '3'+ '2'는 거의 '5' 내가 본 문자 인코딩 중. –

답변

8

데이터의 한 자릿수에 전체 문자를 사용하고 수행 한 연산이 하드웨어 구현 산술 연산을 완전히 사용할 수 없으므로 상당히 느립니다. 훨씬 더 좋은 방법은 임의의 길이의 바이너리 형식을 설계하는 것입니다. https://gmplib.org을 참조하십시오. 뿐만 아니라 다른 많은 옵션이 있습니다.

+1

일부 아키텍처에서는 이러한 문자 기반 처리를위한 하드웨어 지원이 실제로 있습니다. 예를 들어, 32-bit'x86 아키텍처는'AAA' (추가 후 ASCII 조정),'AAS' (감산 후의 ASCII 조정),'AAM' (곱셈 후의 ASCII 조정) 및'AAD' (ASCII 조정 분할 후). 그러나 이들의 존재는 그러한 접근법의 효율성이 매우 낮다는 사실을 변화시키지 않습니다. – njuffa

+1

또한 C++에서 작업하기 쉽도록 ['mpf_class'] (https://gmplib.org/manual/C_002b_002b-Class-Interface.html#C_002b_002b-Class-Interface)를 이용할 수 있습니다. –

1

올바른 길을 가고 있지만 std::string은 올바른 데이터 구조가 아닙니다. 대신 벡터의 각 요소가 0에서 std::numeric_limits<unsigned char>::max() 범위의 값을 갖는 std::vector<unsigned char>을 사용하십시오. 그 상한선은 일반적으로 255입니다. 덧셈과 뺄셈에 대한 규칙은 당신이 어릴 때 배운 것과 같습니다만, 10 대신 256 개의 손가락이 있다는 것만 빼고는 말이죠. 그것은 경박 스럽지만, 당신은 숫자의 기본 256 표현 및 더하기 및 빼기 규칙은 결과가 255보다 크거나 9보다 클 때 수행하는 것을 제외하고는 동일합니다. 더 큰 부호없는 타입으로 산술 연산을 수행하십시오. 결과 % 256은 현재 자릿수의 값이고 결과/256은 전송할 양입니다.

주위를 생각한 후에는 std::vector<unsigned char> 대신 std::vector<unsigned long long>을 사용하는 것도 고려해 볼 수 있습니다. 이는베이스 -2^64에서 산술을하는 것을 의미합니다.