레이블이 실수형인 게시물을 표시합니다. 모든 게시물 표시
레이블이 실수형인 게시물을 표시합니다. 모든 게시물 표시

2015년 6월 17일 수요일

싸이랩(scialb)의 숫자 자료형 (정수형과 실수형)

실수형 데이터

기본적으로 Scilab에서 숫자는 배정도 (C 언어의 double형, 8바이트) 실수형이며 단정도 (C 언어의 float형) 실수는 사용되지 않는다. Scilab뿐만 아니라 다른 수치해석 프로그램에서도 계산 결과의 정밀도가 중요하기 때문에 보통 실수는 정확도가 가장 높은  배정도 실수형으로 다룬다. 따라서 다음과 같이 입력하면 변수 x에 저장되는 수는 보기에는 정수이지만 내부적으로는 double형 실수이며 8바이트가 할당된다.
>> x = 1
이러한 배정도 실수형의 유효 자리는 보통 16자리인데 실용적인 공학 문제를 다룰 때는 대부분의 경우 크게 문제가 되지 않는다. 또한 배정도 실수형으로 다룰 수 있는 정수의 범위는 ~ 이며 이 범위 안에서의 정수 연산은 항상 정확한 값을 가진다. 그러나 이 범위 밖의 정수 연산은 오차가 발생하게 된다.
 보통은 Scilab을 작성할 때는 주로 실수형 데이터를 사용하고 정수형은 사용 빈도가 실수형에 비해서 낮지만 정수형 데이터에 대해서도 설명하도록 하겠다.

정수형 데이터

 배정도 실수 외에 정수형으로 데이터를 변환할 수 있으며 정수형을 다시 double형으로 바꿀 수도 있는데 관련된 함수는 다음과 같다.

[표 1]  숫자형의 변환에 관련된 함수들
함수
기능
double(M)
정수형 행렬 M을 배정도 실수형으로 변환
int8(A)
행렬 A를 8비트 부호 있는 정수형으로 변환
int16(A)
행렬 A를 16비트 부호 있는 정수형으로 변환
int32(A)
행렬 A를 32비트 부호 있는 정수형으로 변환
uint8(A)
행렬 A를 8비트 부호 없는 정수형으로 변환
uint16(A)
행렬 A를 16비트 부호 없는 정수형으로 변환
uint32(A)
행렬 A를 32비트 부호 없는 정수형으로 변환
iconvert(M, itype)
행렬 M을 특정한 형식으로 변환한다.
itype = 0 : 배정도 실수형
itype = 1 : int8 형, itype = 11 : uint8 형
itype = 2 : int16 형, itype = 12 : uint16 형
itype = 4 : int32 형, itype = 14 : uint32 형
inttype(M)
행렬 M의 데이터형을 반환한다. 반환값은 다음과 같다.
0 : 배정도 실수형, 1 : int8 형, 11 : uint8 형, 2: int16 형, 12 : uint16 형, 4 : int32 형, 14 : uint32 형

각 정수형의 숫자 범위는 다음과 같다.
  • 부호가 있는 n비트 정수의 범위: ~
  • 부호가 없는 n비트 정수의 범위: 0 ~

따라서 만약 정수형을 사용한다면 이 범위를 고려해서 프로그래밍을 해야 한다. 연산 결과가 이 범위를 넘어갈 경우 의도하지 않은 결과가 발생함을 다음 예에서 보이고 있다.


 만약 두 정수를 더하는데 서로 자료형이 다르다면 그 결과값은 큰 쪽의 데이터형으로 맞춰진다. 즉, 8비트 정수형과 16비트 정수형을 더하면 그 결과는 16비트 정수형이 된다. 다음 예는 그 사실을 보여주고 있다. 하지만 정수형과 실수형을 연산하면 그 결과는 정수형이 되는 것에도 유의해야 한다.

 Scilab의 정수형은 순환값을 가진다.(circular integers) 이것은 정수가 상한을 넘게되면 하한값을 가지게 되고 반대로 하한값보다 더 작아지면 상한값을 가지게 된다는 의미이다. 예를 들어 int8 형의 상한값은 127이며 여기에 1을 더하면 128이 되지 못하고 하한인 -128값을 가지게 된다. 다른 예로 uint16 의 하한 값은 부호 없는 정수이므로 0인데 여기서 1을 빼게 되면 상한인 65535 가 된다는 것이다.


이에 반해서 Matlab이나 Octave에서의 정수형은 허용범위를 넘어서면 순환하는 것이 아니라 거기에서 멈춘 값을 가진다. 즉 int8(127)+1 은 상한인 127이 되며 uint16(0)-1은 0이 된다. 만약 Scilab 코드를 Matlab이나 Octave로 이식하는 경우 혹은 그 반대의 경우 유의해야 한다.


2015년 4월 17일 금요일

C/C++언어의 실수형 상수

  실수형은 0.001, 2.0, 3.14159와 같은 실수를 저장할 수 있으며 <표1.2.1>에서와 같이 float, double, long double형이 있다. 실수형은 내부적으로 그 데이터를 저장하는 방식이 정수형과 전혀 다르며 유효 자리수와 오차가 존재한다는 사실에 유의해야 한다.

  실수를 표현할 때는 0.1, -2,3 과 같은 보통의 10진 표기법 외에 지수적 표기법이라는 것이 있는데 예를 들면1.234567e5 와 같은 것이다. 이것은 과학적 표기인



를 표현한 것이다. 또 다른 예로 1.234567e-3 은



이다. 실수 상수는 소수점을 반드시 포함해야 하며 지수부는 생략할 수 있다. 예를 들면 다음과 같다.

-----------------------------------------------------------
123.5
123.0 또는 123.
0.123 또는 .123
123e2 는 실수 상수가 아니다. (소수점이 없음)
123.e2는 실수 상수임.
-----------------------------------------------------------

실수형 변수를 선언하고 초기화하는 코드는 다음과 같다.

-----------------------------------------------------------
float fa = 3.14159;
double da = 314.159e-2, db = 123e-3;
long double lda = 10.0;
float fb = .001;
float fc = 123.;
----------------------------------------------------------

  실수 상수는 내부적으로 double형으로 취급되므로 저장하는데 8 byte가 소요된다. 만약 실수 상수를 float 형으로 명시적으로 지정하려면 숫자 뒤에 f/F 접미어를 붙이면 된다.

-----------------------------------------------------------
float fb = 2.34f;
float fa = 1.23e-4f;
----------------------------------------------------------

  실수형은 float형, double형, long double형이 있는데 float형보다 double형의 표현 범위뿐만 아니라 정밀도도 더 높다. (정수형은 예를 들어 short형 보다 long형이 표현 범위만 넓어지는 것과 대조적이다)
[#00010]

C/C++의 자료형과 변수


 자료형(data type)이란 정수, 실수, 문자 등과 같이 프로그램에서 사용되는 데이터의 종류를 의미한다. 사용하고자 하는 데이터의 종류가 정해지면 그것을 저장할 변수는 그것에 맞추어서 만들어져야 한다.

 일반적으로 프로그래밍 언어에서는 기본적인 자료형을 제공하고 사용자들이 필요에 따라 새로운 자료형을 정의할 수 있는 방법을 제공하고 있다. 표준 C/C++언어에서 제공하는 기본적인 자료형을 다음 표에 정리하였다.

[표]  기본 자료형

분류
데이터형
byte
범위
비고
정수형
(signed) char
unsigned char
1
-128~ 127
0~255

(signed) short
unsigned short
2
-32,768 ~ 32,767
0 ~ 65,535

(signed) int

unsigned int
4/2
-2,147,483,648 ~
     +2,147,483,647
0~4,294,967,295

(signed) long

unsigned long
4
-2,147,483,648 ~
     +2,147,483,647
0~4,294,967,295

(signed) long long
unsigned long long
8
-2^63 ~ 2^63-1
0 ~ 2^64-1
C99
C99
실수형
float
4


double
8


long double
12

C99
논리형
bool
boolean
1
1
true,false
C99
C++

 C/C++ 자료형은 크게 정수형과 실수형, 논리형으로 나뉜다. 정수형은 부호가 있는 signed 형과 부호가 없는 unsigned 형이 별개로 존재하지만 실수형은 그렇지 않다. 또한 각각의 자료형은 정해진 크기가 있으나 PC환경에 따라 그 크기가 변화하는 데이터 형이 있음에 주의해야 한다. (대표적인 것이 int형과 long double형이다.)

 논리형은 true, false 두 가지 값만을 가지는 자료형이다. C 언어에서는 C99이후에 stdbool.h 라는 표준 헤더 파일을 인클루드하면 bool형을 사용할 수 있다. C++은 boolean 자료형이 기본으로 제공된다.

 변수는 자료를 담는 그릇이다. 변수를 사용하려면 반드시 먼저 선언을 해야 하며 문법은 다음과 같다.

   자료형 변수명;

예를 들어서 int 형 변수 ia를 사용하려면 다음과 같이 선언을 해야 한다.

   int ia;

이렇게 선언을 한 이후에는 이 변수에 값을 대입한다든지 계산을 하는데 사용할 수 있다.

int ia; // 선언
ia = 100; //사용(초기화) 정수값을 대입
ia = 12*345; //사용 :곱셈 계산

 변수의 '초기화'는 선언된 이후에 맨 처음으로 어떤 값을 대입하는 것을 의미한다. 위와 같이 변수를 선언한 후 초기화를 별도로 할 수도 있고 선언과 동시에 초기화를 수행할 수 도 있다.

long la = 0; // 선언과 동시에 초기화
double da = 1.0; // 선언과 동시에 초기화

이렇게 한 이후에는 자유롭게 변수를 사용할 수 있다.