숫자 뒤의 "f"


102

f숫자 뒤에있는 것은 무엇을 의미합니까? 이것은 C 또는 Objective-C에서 온 것입니까? 이것을 상수에 추가하지 않는 데 차이가 있습니까?

CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);

왜 내가 쓰지 않는지 설명해 주시겠습니까?

CGRect frame = CGRectMake(0, 0, 320, 50);

답변:


88
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를 사용합니다.

이 경우 둘 사이에 (실용적인) 차이가 없습니다.


24
이론적으로 컴파일러는 컴파일 타임에 플로팅으로 변환 할 수있을만큼 똑똑하지 않을 수 있으며, 4 개의 int-> float 변환 (가장 느린 캐스트 중 하나)으로 실행 속도를 늦출 수 있습니다. 이 경우는 거의 중요하지 않지만 필요한 경우 항상 올바르게 f를 지정하는 것이 좋습니다. 표현식에서 올바른 지정자가없는 상수는 전체 표현식이 double로 변환되도록 강제 할 수 있으며, 타이트한 루프에있는 경우 성능 저하가 발생할 수 있습니다. 눈에.니다.
Matteo Italia

60

확실하지 않은 경우 어셈블러 출력을 확인하십시오. 예를 들어 다음과 같이 작고 최소한의 스 니펫을 작성하십시오.

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


11
출력은 나에게도 -O. I 'm on i686-apple-darwin10-gcc-4.2.1 (GCC)
kizzx2 2011

2
LLVM 버전 7.0.0 (clang-700.0.65) x86_64-apple-darwin15.0.0에서 위의 예를 시도했으며 .out 파일도 동일했습니다.
Nick

43

때로는 차이가 있습니다.

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. */

26

컴퓨터에 이것이 부동 소수점 숫자임을 알려줍니다 (여기서는 c / c ++에 대해 이야기하고 있다고 가정합니다). 숫자 뒤에 f가 없으면 이중 또는 정수로 간주됩니다 (소수점이 있는지 여부에 따라 다름).

3.0f -> float
3.0 -> double
3 -> integer

이 규칙은 C ++ 표준의 일부입니까 아니면 컴파일러에서 찾을 수 있습니까?
jxramos 2015 년

1
내가 말할 수있는 한 표준의 일부입니다 (내가 틀렸다면 누군가 나를 고쳐줍니다). 내가 찾을 수있는 가장 빠른 참조는 open-std.org/jtc1/sc22/open/n2356/lex.html#lex.fcon 이지만, 찾는 데 관심이 있다면 최신 참조가 더있을 것입니다.
NickLH 2015 년

5

소스 코드의 부동 소수점 리터럴은 double로 구문 분석됩니다. float 유형의 변수에 할당하면 정밀도가 손실됩니다. 매우 정확합니다. 7 개의 유효 숫자를 버립니다. "f"접미사를 사용하면 컴파일러에게 "내가하는 일을 알고 있습니다. 이것은 의도적 인 것입니다. 그것에 대해 나를 괴롭히지 마십시오".

버그를 생성 할 확률은 그렇게 작지 않습니다. 많은 프로그램이 잘못 생각한 부동 소수점 비교를 계속하거나 0.1이 정확히 표현 가능하다고 가정합니다.


4

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

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


3

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

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


2

From C. float 리터럴 상수를 의미합니다. "f"와 ".0"을 모두 생략하고 int를 float로 암시 적으로 변환하므로 예제에서 int를 사용할 수 있습니다.


1

거의 확실하게 C에서 왔으며 'double'유형보다는 'float'를 사용하려는 욕구를 반영합니다. 긴 정수임을 나타내는 숫자의 L과 같은 접미사와 유사합니다. 정수만 사용할 수 있으며 컴파일러가 적절하게 자동 변환합니다 (이 특정 시나리오의 경우).


0

일반적으로 컴파일러에게 값이 float, 즉 부동 소수점 정수임을 알려줍니다 . 이러한 수단은 예는 정수, 소수 값과 지수 함수를 저장할 수 있는지 1, 0.4또는 1.2e+22.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.