2010-03-08 4 views
3

필자는 부동 소수점을 정수로 사용하고 때로는 "f"접미사를 사용한다고해도 부동 소수점을 선언 할 때 소수점 자리를 사용하는 책과 웹에서 여러 가지 예를 보았습니다. 필요한가? 예를 들어수레를 사용할 때 소수점 이하 자릿수를 사용해야합니까? "f"접미사가 필요합니까?

:

[UIColor colorWithRed:0.8 green:0.914 blue:0.9 alpha:1.00]; 

이는 다른 방법 :

[UIColor colorWithRed:0.8f green:0.914f blue:0.9f alpha:1.00f]; 

는 "F"후행 특별한 무엇을 의미합니까?

[UIColor colorWithRed:0.8 green:0.914 blue:0.9 alpha:1]; 

그래서 그냥 자신과 다른 사람을 생각 나게하는 값이 부동이라는 소수 제로이다 : 그것은가되도록

알파 값의 후행 0을 제거하기가 너무 작동? 나를 의아해했다 것들의

그냥 하나 때문에 어떤 해명을 환영합니다 :)

답변

2

John이 말한대로 소수 자릿수가있는 숫자는 기본값이 double입니다. TomTom이 잘못되었습니다.

컴파일러가 const float (두 가지 일이 일어난 것으로 가정)에 최적화되어 있는지 궁금 해서요 ... 속도 증가에 대한 아이디어가 실제로 합법적 인 것 같아요. 당신이 그것을 얼마나 많이 사용 하느냐에 달려 있습니다. 수학이 많이 필요한 응용 프로그램에서는 아마도이 트릭을 사용하고 싶을 것입니다.

float 변수를 저장하고 double로 캐스팅 한 다음 double (f가없는 숫자)에 대해 수학을 수행 한 다음 다시 float 변수로 캐스팅하여 다시 저장해야합니다. 매번 플로트에 저장하더라도 계산의 차이를 설명 할 수 있습니다.

코드 & 원료 결과 https://gist.github.com/1880400

은 (릴리스은 F 표기법을 사용하여 성능 증가의 더욱 결과) 디버그 프로필 아이 패드 (1)에 관련된 기준을 꺼냈다 :

 
------------ 10000000 total loops 
timeWithDoubles: 1.33593 sec 
timeWithFloats: 0.80924 sec 
Float speed up: 1.65x 
Difference in calculation: -0.000038 

코드 :

int main (int argc, const char * argv[]) { 
    for (unsigned int magnitude = 100; magnitude < INT_MAX; magnitude *= 10) { 
    runTest(magnitude); 
    } 
    return 0; 
} 

void runTest(int numIterations) { 
    NSTimeInterval startTime = CFAbsoluteTimeGetCurrent(); 
    float d = 1.2f; 
    for (int i = 0; i < numIterations; i++) { 
    d += 1.8368383; 
    d *= 0.976; 
    } 
    NSTimeInterval timeWithDoubles = CFAbsoluteTimeGetCurrent() - startTime; 

    startTime = CFAbsoluteTimeGetCurrent(); 
    float f = 1.2f; 
    for (int i = 0; i < numIterations; i++) { 
    f += 1.8368383f; 
    f *= 0.976f; 
    } 
    NSTimeInterval timeWithFloats = CFAbsoluteTimeGetCurrent() - startTime; 
    printf("\n------------ %d total loops\n", numIterations); 
    printf("timeWithDoubles: %2.5f sec\n", timeWithDoubles); 
    printf("timeWithFloats: %2.5f sec\n", timeWithFloats); 
    printf("Float speed up: %2.2fx\n", timeWithDoubles/timeWithFloats); 
    printf("Difference in calculation: %f\n", d - f); 
} 
-2

후행 F :이 부동이다.

후행 f + "." - 중복.

간단합니다.

8f는 8이다.

8.0은 float로 8입니다.

8은 8 정수입니다.

8.0f는 float로 8입니다.

대부분 "f"는 스타일 일 수 있습니다. 두 개가 아닌 float 유형인지 확인하십시오.

+3

은 사실 "1.0"우스입니다 동맹국은 부유층이 아니라 이중으로 취급됩니다. –

5

기본적으로 십진수는 double로 처리됩니다. 1.0f를 사용하면 컴파일러에서 float (double보다 작음)를 사용하도록 지시합니다. 대부분의 경우 숫자가 double 또는 float인지 여부는 중요하지 않습니다. 컴파일러는 결국 작업의 올바른 형식을 얻을 수 있도록합니다. 고성능 코드에서는 명시 적으로 표현할 수 있지만 직접 벤치마킹하는 것이 좋습니다.

+2

따라하기 : 1 세대 iPhone에는 기본 소프트웨어 배정도가 지원되지 않으므로 (소프트웨어 에뮬레이션에서 처리됨) 프로그래머는 "f"를 추가하여 성능을 약간 향상 시켰습니다. –

관련 문제