2013-06-24 6 views
-2

데이터 손실없이 문자열을 float로 변환하려고합니다. 예를 들어 istringstream 또는 :: atof (x.c_str())를 사용하는 경우 반올림으로 인해 데이터가 느슨합니다.C++에서 데이터 손실없이 float/double로 문자열 변환

일반적으로이 문제는 저에게는 문제가 아니지만 읽는 것과 동일한 데이터를 사용하고 있습니다. 다음은 숫자의 예와 그 변환 대상입니다.

-8.000001 -> -8 
-0.6257381 -> -0.625738 
12.0 -> 12 (drops the .0) 

사람이, 내가 엄지 손가락의 규칙으로

감사 매트

+5

덜 정밀도로 인쇄하는 것이 확실합니까? 그리고 누구의 오류가 유효한 결과가 아닌지 변환하는 것을 사용하는 것이 좋습니다. – chris

+5

일반적으로 float/double의 제한된 비트 수 때문에 항상 반올림 오류가 발생하므로 불가능합니다. 또한 Base 10에서 Base 2와 다른 반올림 오류가 있습니다. 또한 12.0은 이진 표현에서 12와 동일하므로 서로 다를 수 없습니다. – bennofs

+0

바로 알기 Bennofs – Makka

답변

4

귀하의 질문에 세 가지 잠재적 인 문제가 있습니다 표시 정밀도

  1. 양은. 사용 된 정밀도를 제어하려면 #include <iomanip>을 포함하고 std::cout << std::setprecision(17);을 사용하여 사용할 자릿수를 설정하십시오.

  2. 서식 지정. "12.0"을 "12.0"으로 설정하고자하는 경우, ".0"은 float 또는 double에 저장되지 않습니다. double에는 값 12 만 포함됩니다. 원래 정밀도 또는 오류 간격에 대한 정보를 포함하지 않습니다. 그것은 정확하게 12이고 다른 것은 없습니다. 특정 방식으로 형식을 지정하려면 I/O 스트림의 형식 플래그를 사용하거나 형식을 지정하기 위해 자체 코드를 작성해야합니다.

  3. 정확도. floatdouble 유형은 정확히 8.000001 또는 0.6257381을 나타낼 수 없습니다. 부동 소수점 값을 나타 내기 위해 이진수를 사용하며 소수점 숫자가 이진수로 변환 될 때 약간의 오류가 발생합니다. 부동 소수점을 매우 단순하게 사용하고 floatdouble의 제한보다 훨씬 적은 숫자로 작업하는 경우이를 무시하고 제한된 자릿수로 숫자의 형식을 지정할 수 있습니다. 단순한 경우를 초과하면 오류 분석을 수행해야하는데 이는 매우 복잡 할 수 있습니다.

0

매우 감사하게 될 거라고 나를 도울 수있는 float 6 개 유효 숫자 만 정확합니다. 따라서 문자열에 정밀도 제한이 적용된다는 점에서 더 많은 숫자가있는 경우

double은 놀랍지 만이 정확도의 약 2 배를 제공합니다. 즉 유효 숫자 12 자리

자세한 내용은 Number of significant digits for a floating point type을 참조하십시오.

+0

나는 이것이 문제가 될 수 있다고 생각했지만, 나는 온라인으로 그것을 체크하고, 내가 사용하고있는 double은 괜찮을 것이라고 결론을 내렸다. 나는 해결할 수없는 C++ 반올림 문제라고 생각한다 :/ – Makka

+0

오, double을 사용하면, 뭔가 다른 것이 확실합니다. 인쇄 정밀도를 살펴 보겠습니다. @chris '주석을 참조하십시오. – Bathsheba

1

다른 데이터 유형이 필요합니다.

부동 소수점 십진 형식을 사용하면 원하는대로 정확하게 번호를 저장할 수 있습니다. 이러한 유형에서 숫자는 과학 표기법과 마찬가지로 IEEE 이진 부동 소수점과 비슷한 쌍 (가수, 지수)으로 저장됩니다.

내 예로서는 예

(-8000001, -6) 
(-6257381, -7) 
(120, -1) 

로 저장 될 것이고, 의료 기기의 통신을위한 ISO 11073 표준은 이러한 형식을 사용한다.

모든 부동 소수점 연산 하드웨어는 밑수가 2 인 지수를 사용하여 숫자와 작동하도록 설계 되었기 때문에 산술 연산 속도가 매우 느릴 수 있습니다.

관련 문제