본문 바로가기

옥탑방주인/개인공부

float형과 double형의 차이

<질문>


프로그램 원문입니다.

=================================================================

#include <iostream>
using namespace std;

 

const int SIZE = 20;

 

struct CandyBar {
 char brand[SIZE];
 float weight;
 int calorie;
};

 

void main( void ) 
{
 CandyBar snack = {
  "Mocha Munch",
  2.3,
  350
 };

 cout << snack.brand << '\n';
 cout << snack.weight << '\n';
 cout << snack.calorie << '\n';
}


=================================================================

 

위 프로그램을 돌리면 아래와 같은 경고가 뜹니다.

 

warning C4305: 'initializing' : truncation from 'const double' to 'float'

 

=================================================================

질문

 

2.3 정도면 float형으로도 충분히 표현할 수 있다고 생각되는데

경고가 뜨는 이유가 무엇인지요??

추가된 질문 (2005-07-29 02:25 추가)

답변 감사합니다.

하나만 더 여쭙겠습니다.

기본이 double형이라고 하셨는데 float도 가능한 범위를 double형으로

선언하면 메모리 낭비가 아닌지요?

warning 없이 float를 사용하는 방법은 float w=2.3f 뿐이 없는지요.

추가 답변 확인 되는데로 내공드리겠습니다.








<답변1>


실수는 IEEE 754 에서 그 표현 방법이 설명 되어 있습니다..

보다 정확한 내용을 확인하시려면 IEEE 754 문서를 참조 하시구요..

 

msdn.microsoft.com 에서 발췌했습니다..

 

The Double value type represents a double-precision 64-bit number with values ranging from negative 1.79769313486232e308 to positive 1.79769313486232e308, as well as positive or negative zero, PositiveInfinityNegativeInfinity, and Not-a-Number (NaN).

 

Double complies with the IEC 60559:1989 (IEEE 754) standard for binary floating-point arithmetic.

 

double이 64bit이고

 

float가 32bit인건 아시죠??

 

맨 마지막 줄에 보시면 double은 실수 연산의 standard (기본)이라고 써 있습니다..

 

그래서 c / c++ 프로그램을 작성할때

 

float w=2.3; 을 넣어 주면 error가 아닌 warning이 나는 겁니다..

 

(실수는 double이 기본이라고 정의되어있으니까요..)

 

warning 없이 프로그램을 작성하시려면

 

double로 선언 하시던지 아니면

 

float w=2.3f 이런식으로 꼭 float형인것을 표현해 줘야 합니다..^^

 

 

 =========================================================================

 

메모리 낭비인것은 확실합니다.. 32bit면 충분할 공간을 64bit로 선언했으니까요..

 

하지만 이것 하나만 생각해 보세요..

 

실수로 입력되는 값이 

 

double에서 float로 truncation(절삭) 될 경우는 자신이 원하지 않는 근사값이 나옵니다..

 

반면 float 에서 double 로 값이 확장될 경우

 

float 로 표현하려는 값은 정확하게 double로 표현이 됩니다..

 

이때문에 기본형이 double이 된것 입니다..

 

그리고 float 는 소수 6~8자리 double은 소수 14~16자리정도를 표현할수 있습니다..

 

 

 

 

<답변2>

상수값의 사용에 별도의 명기를 하지 않을 경우

 

정수는 int 실수는 double 형이 됩니다.

 

그러므로 2.3이라는 값이 double형이 되지 않고 float형이 되기 위해서는 2.3f or 2.3F 와 같이 


float형임을 표시해 명기해 주어야 합니다.

 

또한 정수 23을 long형으로 한다면 2.3l or 2.3L 로 표기해 주어야 합니다.

 

float형으로도 가능한 값을 double형으로 하는 것은 최근의 프로그래밍 환경에서 약간의 


메모리 낭비가 있더라도 정확도와 안정성을 고려해 언어와 컴파일러 설계시 그리 하는 것으로 


압니다.


'옥탑방주인 > 개인공부' 카테고리의 다른 글

아파치 스톰(Apache-Storm) 1.0.3 설치  (0) 2017.03.03
라즈베리파이 화면  (0) 2017.01.31
SDN Layer Architecture  (0) 2017.01.05
Network Functions Virtualization in Home Networks  (0) 2017.01.04
traffic-intensivce  (0) 2016.12.28