문제

celsius = (5.0/9.0) * (fahr-32.0);

C 개발자가 결정한 개발 선택입니까, 아니면 이에 대한 이유가 있습니까?저는 float가 double보다 작다고 생각합니다. 따라서 어떤 십진수 형식을 사용해야 할지 몰라서 발생하는 오버플로를 방지하기 위한 것일 수도 있습니다.그게 이유인가요, 아니면 제가 뭔가를 간과하고 있는 걸까요?

도움이 되었습니까?

해결책

그 이유는 어떤 결과라도 포괄할 수 있도록 하기 위해서라고 생각합니다.따라서 가장 큰 데이터 유형이므로 자연스러운 선택은 두 배입니다.

다른 팁

celsius = (5.0/9.0) * (fahr-32.0);

이 표현에서, 5.0, 9.0, 그리고 32.0 ~이다 double에스.이것이 부동 소수점 상수의 기본 유형입니다. 원하는 경우 float그렇다면 다음을 사용하게 됩니다. F 접미사:

celsius = (5.0F/9.0F) * (fahr-32.0F);

만약에 참고하세요 fahr 했다 double, 이 마지막 표현식의 결과는 다음과 같습니다. 아직 가 되다 double:Vaibhav가 지적했듯이 유형은 잠재적으로 정밀도 손실을 방지하는 방식으로 승격됩니다.

표현식이 배정밀도로 캐스팅되는 이유는 지정된 리터럴이 기본적으로 배정밀도 값이기 때문입니다.방정식에 사용된 리터럴을 부동 소수점으로 지정하면 표현식은 부동 소수점을 반환합니다.다음 코드를 고려하십시오(gcc 4.01을 사용하는 Mac OS X).

#include <stdio.h>
int main() {
  float celsius;
  float fahr = 212;
  printf("sizeof(celsius) ---------------------> %d\n", sizeof(celsius));
  printf("sizeof(fahr) ------------------------> %d\n", sizeof(fahr));
  printf("sizeof(double) ----------------------> %d\n", sizeof(double));
  celsius = (5.0f/9.0f) * (fahr-32.0f);
  printf("sizeof((5.0f/9.0f) * (fahr-32.0f)) --> %d\n", sizeof((5.0f/9.0f) * (fahr-32.0f)));
  printf("sizeof((5.0/9.0) * (fahr-32.0)) -----> %d\n", sizeof((5.0/9.0) * (fahr-32.0)));
  printf("celsius -----------------------------> %f\n", celsius);
}

출력은 다음과 같습니다

sizeof(celsius) ---------------------> 4
sizeof(fahr) ------------------------> 4
sizeof(double) ----------------------> 8
sizeof((5.0f/9.0f) * (fahr-32.0f)) --> 4
sizeof((5.0/9.0) * (fahr-32.0)) -----> 8
celsius -----------------------------> 100.000008

부동 소수점 상수는 사용 가능한 최고 정밀도를 가져야 합니다.결과는 큰 문제 없이 float에 할당될 수 있습니다.

K&Rv1 시절에는 부동 소수점 유형을 사용하는 모든 표현식이 항상 'double' 표현을 사용하여 평가되었기 때문에 float/double을 상호 교환적으로 사용하는 것이 권장되었습니다. 이는 효율성이 가장 중요한 경우 문제입니다.f, F, l 또는 L 접미사가 없는 부동 소수점 상수는 double 유형입니다.그리고 문자 f 또는 F가 접미사인 경우 상수는 float 유형입니다.그리고 문자 l 또는 L이 접미사로 붙으면 long double 유형입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top