2014-11-22 3 views
-6

입력이 1.251564 인 경우를 가정 해 보겠습니다.두 배로 숫자를 찾는 방법은 무엇입니까?

int numFloating; 

// code to go here that leads to 
// numFloating == 6 

추신을 다음과 같이

어떻게 출력을 가지고 "." 후 얼마나 많은 요소를 찾을 수 있습니다 죄송합니다 코드를 제공하지, 난 그냥이 구현되는 방법 :(

감사합니다 귀하의 답변에 대해 아무 생각이 없다!

+3

도트 뒤의 요소 수는 1/3입니다. 수학적으로 말하자면, 10 진수로 보면 점 뒤에 무한한 3이 나온다. 나는이 숫자가 10 배 (예를 들어)로 곱해질 때 분명히 반응 할 것이 확실하지 않다. 분명히 숫자 무한대를 저장할 수 없다. 부동 소수점 값의 표현과 조작으로이를 허용하지 않으므로 간단한 질문이 아닙니다. –

+0

우리는 더블 타입을 가지고 있다고 가정 해 봅시다 - 이는 점 뒤에 최대 16 개의 원소가 있음을 의미합니다. – SuTron

+0

나는 편집을 되돌 렸습니다.새로운 질문을 할 때, 새로운 질문으로 질문해야합니다. –

답변

1

이렇게 잘 끝나지 않습니다. 문제는 때로는 이진수로 숫자를 나타낼 때 실수 (컴퓨터가하는 것)가 발생한다는 것입니다. 예를 들어, 1/3 + 1/3 + 1/3을 추가하면 0.999999가 될 수 있습니다 ... 소수 자릿수가 크게 다릅니다.

라비는 이미 그것을 계산하는 좋은 방법을 제공하는, 그래서 다른 하나를 제공합니다 :

double number = 0; // should be equal to the number you want to check 
int numFloating = 0; 
while ((double)(int)number != number){ 
    number *= 10; 
    numFloating++; 
} 

수는 소수점 이하 자릿수를 확인 할 번호를 보유하고 이중 변수입니다.

+0

감사합니다. "숫자"가 무엇인지 명확히 설명해 주시겠습니까? 입력? – SuTron

+0

'double number = 1.251564'로,이 코드는'numFloating == 0'이됩니다. –

+1

이것은 10 배의 곱셈이 정확하지 않기 때문에 원칙적으로조차 작동하지 않습니다. –

2

가장 간단한 방법은 문자열에 저장하는 것입니다.

std::string str("1.1234"); 
size_t length = str.length(); 
size_t found = str.find('.', 0); 
size_t count = length-found-1; 
int finallyGotTheCount = static_cast<int>(count); 
+0

답해 주셔서 감사합니다. 그리고 그 숫자를 정수로 사용하려면 어떻게 변환 할 수 있습니까? – SuTron

+0

업데이트 된 답변을 확인하십시오. – ravi

+0

감사합니다. 답변을 잘 설명했습니다. 불행히도 std 표준을 사용하는 것을 피하고 싶습니다. string : 크로스 플랫폼에서 작업 할 때 감사합니다. – SuTron

0

하는 경우 . 당신이 분수를 곱셈 (10)에 의해 반복 0.1234

말을하고 제로를 얻을 때까지 수의 정수 부분을 버릴 수 있습니다 단계의 수는 소수의 수있을 것입니다 예 :..

.1234 * 10 = 1.234 
.234 * 10 = 2.34 
.34 * 10 = 3.4 
.4 * 10 = 4.0 

그러나 문제는 "부동"인 1.199999999와 같은 숫자가있을 때 발생합니다.

0
int numFloating = 0; 

double orgin = 1.251564; 

double value = orgin - floor(orgin); 

while(value == 0) 
{ 
    value *= 10; 
    value = value - floor(value); 
    numFloating ++; 
} 

이 코드를 사용하면 대답이 잘못되는 경우가 있습니다. exp : 부동 소수점에서 0은 (2^31) -1과 같습니다. 출력은 실제로 저장되는 방법에 따라 다릅니다.

+0

감사합니다. 변환해야 할 필요가 없기 때문에 저에게 적합해야합니다. :) – SuTron

5

귀하의 번호를 고려해 보겠습니다. . 이것을 double에 저장하면 이진 IEEE754 형식으로 저장됩니다. 그리고 그 숫자가 표명되지 않을 수도 있습니다. 그럼이 번호를 확인해 봅시다. closest representable 이중은 다음과 같습니다.

1.25156 39999 99999 89880 45035 73046 53152 82344 81811 52343 75 

이것은 아마도 당신에게 놀라운 것입니다. 소수점 뒤에 52 자리의 10 진수가 있습니다.

10 진수 표현에 대해 질문 할 경우 double이 아닌 10 진수 데이터 형식을 사용해야한다는 점을 고려해야합니다. 실제로 가치를 정확하게 나타낼 수 있다면 기대에 부합하는 방식으로이를 추론 할 수 있습니다.

+0

고마워, 잘 알고있어. 해결하고자하는 문제는 소수의 형태로 된 이중 숫자에 홀수 분모가 있는지 확인하는 것입니다. – SuTron

+0

좋은 링크입니다. 나는 0.1이 실제로 0.1이 아니라는 것을 좋아합니다. – fredoverflow

+0

@MikaelEgibyan 그렇다면 왜 "소수의 형태로 이중 숫자가 홀수 분모를 가지는지 어떻게 결정합니까?"라고 묻지 않았습니까? – fredoverflow

관련 문제