f숫자 뒤에있는 것은 무엇을 의미합니까? 이것은 C 또는 Objective-C에서 온 것입니까? 이것을 상수에 추가하지 않는 데 차이가 있습니까?
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);
왜 내가 쓰지 않는지 설명해 주시겠습니까?
CGRect frame = CGRectMake(0, 0, 320, 50);
f숫자 뒤에있는 것은 무엇을 의미합니까? 이것은 C 또는 Objective-C에서 온 것입니까? 이것을 상수에 추가하지 않는 데 차이가 있습니까?
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);
왜 내가 쓰지 않는지 설명해 주시겠습니까?
CGRect frame = CGRectMake(0, 0, 320, 50);
답변:
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);
부동 상수를 사용합니다. (상수 0.0은 일반적으로 Objective-C에서 double을 선언합니다. 끝에 f를 붙이면-0.0f-상수를 (32 비트) 부동 소수점으로 선언합니다.)
CGRect frame = CGRectMake(0, 0, 320, 50);
자동으로 float로 변환되는 int를 사용합니다.
이 경우 둘 사이에 (실용적인) 차이가 없습니다.
확실하지 않은 경우 어셈블러 출력을 확인하십시오. 예를 들어 다음과 같이 작고 최소한의 스 니펫을 작성하십시오.
#import <Cocoa/Cocoa.h>
void test() {
CGRect r = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);
NSLog(@"%f", r.size.width);
}
그런 다음 -S옵션 을 사용하여 어셈블러로 컴파일하십시오 .
gcc -S test.m
어셈블러 출력을 test.s파일 에 저장하고 .0f상수에서 제거 하고 컴파일 명령을 반복하십시오. 그런 다음 diff새 항목 test.s과 이전 항목 중 하나를 수행하십시오. 실제 차이점이 있는지 보여줄 것이라고 생각하십시오. 너무 많은 사람들이 컴파일러가하는 일에 대한 비전 을 가지고 있다고 생각하지만, 결국에는 이론을 검증하는 방법을 알아야합니다.
-O. I 'm on i686-apple-darwin10-gcc-4.2.1 (GCC)
때로는 차이가 있습니다.
float f = 0.3; /* OK, throw away bits to convert 0.3 from double to float */
assert ( f == 0.3 ); /* not OK, f is converted from float to double
and the value of 0.3 depends on how many bits you use to represent it. */
assert ( f == 0.3f ); /* OK, comparing two floats, although == is finicky. */
컴퓨터에 이것이 부동 소수점 숫자임을 알려줍니다 (여기서는 c / c ++에 대해 이야기하고 있다고 가정합니다). 숫자 뒤에 f가 없으면 이중 또는 정수로 간주됩니다 (소수점이 있는지 여부에 따라 다름).
3.0f -> float
3.0 -> double
3 -> integer
소스 코드의 부동 소수점 리터럴은 double로 구문 분석됩니다. float 유형의 변수에 할당하면 정밀도가 손실됩니다. 매우 정확합니다. 7 개의 유효 숫자를 버립니다. "f"접미사를 사용하면 컴파일러에게 "내가하는 일을 알고 있습니다. 이것은 의도적 인 것입니다. 그것에 대해 나를 괴롭히지 마십시오".
버그를 생성 할 확률은 그렇게 작지 않습니다. 많은 프로그램이 잘못 생각한 부동 소수점 비교를 계속하거나 0.1이 정확히 표현 가능하다고 가정합니다.