[objective-c] 숫자 뒤의 “f”

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과 이전 항목 중 하나를 수행하십시오. 실제 차이점이 있는지 보여줄 것이라고 생각하십시오. 너무 많은 사람들이 컴파일러가하는 일에 대한 비전 을 가지고 있다고 생각하지만, 결국에는 이론을 검증하는 방법을 알아야합니다.


답변

때로는 차이가 있습니다.

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이 정확히 표현 가능하다고 가정합니다.


답변

f소리 야 아마 부동으로 일하고 있음을 컴파일러에게 의미가된다. 를 생략하면 f일반적으로 double로 변환됩니다.

둘 다 부동 소수점 숫자이지만 a float는 a 보다 적은 비트 (따라서 더 작고 덜 정확함)를 사용합니다 double.


답변

그것은 C 일입니다. 부동 소수점 리터럴은 기본적으로 배정 밀도 (double)입니다. f 접미사를 추가하면 단 정밀도 (float)가됩니다.

int를 사용하여 여기에 값을 지정할 수 있으며이 경우에는 차이가 없지만 올바른 유형을 사용하는 것이 좋은 습관입니다. 일관성은 일반적으로 좋은 것이고 나중에 이러한 값을 변경해야하는 경우 그들이 어떤 유형인지 한눈에 알 수 있습니다.