2013-12-12 3 views
0

long double이 int인지 확인하기 위해 for-loop을 사용하고 있습니다. 나는 for 루프가 2와 final^1/2 사이에 또 ​​다른 long double을 반복하도록 설정했다. Final은 기본적으로 2에서 10 마이너스 1의 힘으로 설정 한 루프입니다. final이 정수인지 확인합니다. 내 질문에 어떻게 정수만 final 값을 얻을 수 있습니까? 내 설명이 약간 혼란스러워서 여기 내 전체 루프 코드가 있습니다. BTW 나는이 숫자를 매우 크게 늘릴 계획이므로 long double을 사용하고 있습니다.double가 int 인 경우에만 같은 double을 반환합니까? Obj-C

for (long double ld = 1; ld<10; ld++) { 
    long double final = powl(2, ld) - 1; 
    //Would return e.g. 1, 3, 7, 15, 31, 63...etc. 

    for (long double pD = 2; pD <= powl(final, 0.5); pD++) { 
    //Create new long double 
    long double newFinal = final/pD; 
    //Check if new long double is int 
    long int intPart = (long int)newFinal; 
    long double newLong = newFinal - intPart; 

    if (newLong == 0) { 
     NSLog(@"Integer"); 
     //Return only the final ints? 
    } 
} 
} 
+0

@nhgrif 종류가 있습니다. 숫자를 가져 와서 길게 캐스트하고 다시 두 번 캐스팅 한 다음 두 비트를 비교할 수 있어야합니다. 당신이 검사해야 할 유일한 다른 점은 long에서 "used"된 비트 수가 double의 가수의 크기보다 적다는 것입니다. –

+0

죄송합니다. 'long double'을 사용하고 있으며 'long'과 'double'사이에 캐스팅하지 않습니다. 아마도 당신은'long long'으로 캐스팅 할 수 있을까요? –

답변

1

그냥 int로 캐스팅하여 자체에서 빼십시오. 때문에 부동 소수점 연산을하는 방식의 메모로


...

long double d; 
//assign a value to d 

int i = (int)d; 
if((double)(d - i) == 0) { 
    //d has no fractional part 
} 

== 검사가 필요 할 수있는 최선의 일이 아니다, 프로그램에서 작동합니다. 특정 수준의 공차를 결정하고 d이 허용 오차 내에 있는지 확인하는 것이 좋습니다. 예를 들어

:

if(fabs((double)(d - i)) < 0.000001) { 
    //d's fractional part is close enough to 0 for your purposes 
} 

당신은 또한 같은 일을 달성하기 위해 long long intlong double를 사용할 수 있습니다.

  • fabsf(float)
  • fabs(double)
  • fabsl(long double)

편집 ... : 그냥 당신이 사용하는 어떤 유형에 대한 올바른 절대 값 기능을 사용하십시오 실제 문제에 대한 설명을 토대로 ... 컬렉션을 반환하는 방법을 알아 내려는 것 같습니다. 방법.

-(NSMutableArray*)yourMethodName { 
    NSMutableArray *retnArr = [NSMutableArray array]; 

    for(/*some loop logic*/) { 
     // logic to determine if the number is an int 

     if(/*number is an int*/) { 
      [retnArr addObject:[NSNumber numberWithInt:/*current number*/]]; 
     } 
    } 

    return retnArr; 
} 

로직을이 방법에 사용하십시오. 반환하려는 번호를 찾으면 [retnArr addObject:[NSNumber numberWithInt:]]; 방법을 사용하여 배열에 붙여야합니다. 당신은 배열을 반환하면

,이 같은 숫자에 액세스 :

[[arrReturnedFromMethod objectAtIndex:someIndex] intValue]; 

선택적으로, 서로 다른 유형으로 NSNumber 객체로 던져 할 수 있습니다.

  • [NSNumber numberWithDouble:]
  • [NSNumber numberWithLongLong:]

를 그리고 수를 추출 일치하는 게터 (doubleValue, longLongValue)이 있습니다 :

당신은 또한 사용할 수 있습니다.NSNumber에 대한 다른 여러 가지 방법이 있지만 가장 많이 사용하는 것 같습니다.

+0

미안하지만 이미 가지고 있습니다. 나는 나의 설명이 명확하지 않을 수도있다. 나는 그것이 int인지 아닌지를 이해하는 방법을 안다. d가 변경 되었기 때문에 int 인 d 개만 반환하려고합니다. 0 점을 확인하는 데 도움을 주셔서 감사합니다. – Milo

+0

어디서 붙어 있는지 분명히 밝혀야합니다. 'if'는 소수 부분을 가지지 않는 모든 double에 대해 true를 반환하고 double에 대해서는 false를 반환합니다. 그 논리를 사용하여 숫자를 정렬하는대로 원하는대로 할 수 있습니다. – nhgrif

+0

좋아요. A. A를 가지고 있습니다. A는 루프를 통과하여 1, 3, 7, 15, 31 등의 숫자가되는 이중입니다. 이제 루프 내에서 A를 가져 와서 루프를 통과 한 다른 이중 B로 나누고 싶습니다. 그 두 배는 A에서 2의 거듭 제곱입니다. 우리는 이제 A/B를가집니다. A/B를 double C로 설정했습니다.이 모든 값이 변하기 때문에 C가 int 일 때 NSLOG C를 원합니다. 명확한? – Milo