문제

나는 하루 종일 이것에 머리를 두드리고있다. 현재 작업중 인 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의 플로트를 오가는 것으로 전환하여 어쨌든 숫자의 문자열 형태를 유지할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top