플로트에서 개별 숫자를 추출합니다
-
19-08-2019 - |
문제
나는 하루 종일 이것에 머리를 두드리고있다. 현재 작업중 인 C ++ 프로젝트에는 편집 가능한 값을 표시해야합니다. 현재 선택된 숫자는 상기 숫자에 대해 위의 증가 된 값과 아래의 값을 낮추는 값을 표시합니다. 편집 가능한 값을 숫자와 숫자 모음으로 참조 할 수있는 것이 유용합니다. 굉장한 점은 색인 가능한 형태의 부동 소수점 번호가 있다면 그러한 솔루션을 찾을 수 없었습니다. 나는 내가 놓친 것이 있는지 또는 내 자신을 굴려야하는지 확인하기 위해이 질문을 던지고있다.
조언 해주셔서 감사합니다! 플로트 -> 문자열 -> int에서 변환하지 않는 솔루션을 기대하고 있었지만 나는 생각한다 이것이 부동 소수점 양자화 문제에서 벗어나는 가장 좋은 방법입니다. 나는 boost :: 형식으로 가고 문자열의 개별 문자를 참조했습니다. 나는 MODF와 FMOD의 조합을 사용하여 플로트에서 숫자를 얻으려고 시도하는 것과 비교하여 큰 성능 차이라는 것을 알 수 없습니다 (아마도 내 구현보다 더 강력하게 장면 뒤에있을 것입니다).
해결책
플로트 포인트 번호의 내부 표현은 당신이 보는 것과 같지 않습니다. 당신은 stirng에만 캐스팅 할 수 있습니다.
캐스트하려면 다음을 수행하십시오.
char string[99];
sprintf(string,"%f",floatValue);
또는 이것을 참조하십시오 : http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.1
Wikipedia 기사는 표현에 대해 더 많이 설명 할 수 있습니다. http://en.wikipedia.org/wiki/floating_point
다른 팁
아, 문자열로 변환하는 방법에는 여러 가지가 있습니다. (나는 s를 선호하지만Nprintf () 나 자신.)
또는 INT로 변환하고 모듈러스와 정수 분할로 숫자를 꺼낼 수 있습니다. log {base10}으로 숫자 수를 계산할 수 있습니다.
(기억하십시오 : log {basea} _x / log {basea} _b = log {baseb} _x.)
예시:
#define SHOW(X) cout << # X " = " << (X) << endl
int
main()
{
double d = 1234.567;
SHOW( (int(d)%10000) / 1000 );
SHOW( (int(d)%1000) / 100 );
SHOW( (int(d)%100) / 10 );
SHOW( (int(d)%10) );
SHOW( (int(d*10) % 10) );
SHOW( (int(d*100) % 10) );
SHOW( (int(d*1000)% 10) );
SHOW( log(d)/log(10) );
}
static_cast를 사용해야하지만 ...
지수 표기법을 조심하십시오. 매우 크거나 아주 작은 숫자로 문제가있을 수 있습니다.
부동 소수점 번호에는 또한 슬픔을 유발할 수있는 라운드 오프 문제가 있습니다. (우리가 연산자를 사용하지 않는 이유와 같은 이유입니다. 약 10^-25.)
boost :: lexical_cast를 사용하여 문자열과 플로트 사이를 캐스트 할 수 있습니다. 그러나 플로트 양식을 직접 색인 할 수는 없습니다. 내부적으로 소수 자릿수로 저장되지 않습니다. 이것은 아마도 그다지 많은 문제가 아닐 것입니다. UI의 경우 Getter/Setter의 플로트를 오가는 것으로 전환하여 어쨌든 숫자의 문자열 형태를 유지할 것입니다.