programing

부동 값에 접미사 'f'를 사용하는 이유는 무엇입니까?

kingscode 2022. 10. 19. 21:25
반응형

부동 값에 접미사 'f'를 사용하는 이유는 무엇입니까?

C에 있는 이 두 변수의 차이는 무엇인지 궁금합니다.

float price = 3.00;

그리고.

float price = 3.00f;

접미사의 용도는 무엇입니까?f이 경우?

3.00로 해석됩니다.double와는 반대로3.00f컴파일러에 의해 컴파일러가?float.

fsuffix는 컴파일러에게 단순히 어떤 것이 어떤 것인지 알려준다.float그리고 어떤 것이double.

'MSDN(C++)' 참조

고정되지 않은 부동소수점 리터럴은 2배이고 반올림은 작은 리터럴이라도 반올림하여 부동소수점 리터럴과 2배의 값을 취할 수 있음을 의미합니다.이것은, 다음의 예에서 확인할 수 있습니다.

float f=0.67;
if(f == 0.67) 
  printf("yes");
else 
  printf("no");  

이렇게 하면 출력됩니다.no,왜냐면0.67는 부동으로 반올림했을 때와 2배로 반올림했을 때의 값이 다릅니다.한편, 다음과 같습니다.

float f=0.67;
if(f == 0.67f) 
  printf("yes");
else 
  printf("no"); 

출력yes.

접미사는 대문자 또는 소문자를 사용하여 지정할 수 있습니다.

이것도 시도해 보세요.

printf(" %u %u\n", sizeof(.67f), sizeof(.67));

@codepade 체크

이미 말한 내용과 더불어 1.0 대 1.0f를 추적하는 것이 많은 사람들이 알고 있는 것보다 더 중요합니다.코드를 이렇게 쓰면:

float x;
...
float y = x * 2.0;

2.0은 더블이기 때문에 x는 더블로 승격됩니다.컴파일러는 프로모션을 최적화할 수 없습니다.그렇지 않으면 C 표준을 위반하게 됩니다.계산은 2배의 정밀도로 이루어지며, 결과는 암묵적으로 플로트로 잘립니다.즉, 2.0f 또는2를 썼을 때보다 계산이 느립니다(단, 더 정확합니다).

2라고 쓰면 상수는 int 타입으로 플로트로 승격되어 "플로트 정밀도"로 계산됩니다.훌륭한 컴파일러라면 이 프로모션에 대해 경고할 것입니다.

"일반 산술 변환" 규칙에 대한 자세한 내용은 여기를 참조하십시오.

http://msdn.microsoft.com/en-us/library/3t4w2bkb%28v=vs.80%29.aspx

부동 데이터 유형과 이중 데이터 유형 간의 비교 조합을 몇 가지 추가합니다.

int main()
{
    // Double type constant(3.14) converts to Float type by 
    // truncating it's bits representation 
    float a = 3.14; 
    // Problem: float type 'a' promotes to double type and the value 
    // of 'a'  depends on how many bits added to represent it.
    if(a == 3.14)   
        std::cout<<"a: Equal"<<std::endl;
    else
        std::cout<<"a: Not Equal"<<std::endl; 

    float b = 3.14f; // No type conversion
    if(b == 3.14)    // Problem: Float to Double conversion
        std::cout<<"b: Equal"<<std::endl;
    else
        std::cout<<"b: Not Equal"<<std::endl;

    float c = 3.14; // Double to Float conversion (OK even though is not a good practice )
    if(c == 3.14f)  // No type conversion 
        std::cout<<"c: Equal"<<std::endl;  // OK
    else
        std::cout<<"c: Not Equal"<<std::endl;

    float d = 3.14f;
    if(d == 3.14f)
        std::cout<<"d: Equal"<<std::endl; // OK
    else
        std::cout<<"d: Not Equal"<<std::endl;

    return 0;
}    

출력:

 a: Not Equal
 b: Not Equal
 c: Equal
 d: Equal

3.00은 더블, 3.00f는 플로트입니다.

컴파일러는 이중 상수를 플로트로 변환하기 때문에 차이는 중요하지 않은 경우가 많습니다.단, 다음 사항을 고려하십시오.

template<class T> T min(T a, T b)
{
  return (a < b) ? a : b;
}

float x = min(3.0f, 2.0f); // will compile
x = min(3.0f, 2);   // compiler cannot deduce T type
x = min(3.0f, 2.0); // compiler cannot deduce T type

이는 부동소수점 숫자 리터럴의 기본 유형인 3.00 문자가 부동소수점이 아닌 이중이기 때문입니다.이것을 컴파일 하려면 , 서픽스 f(또는 F)를 추가할 필요가 있습니다.

언급URL : https://stackoverflow.com/questions/5026570/whats-the-use-of-suffix-f-on-float-value

반응형