코드네임 :

🖥️ 컴퓨터 구조 과제1 📚 본문

⚙️Computer System/컴퓨터구조

🖥️ 컴퓨터 구조 과제1 📚

비엔 Vien 2024. 3. 19. 01:23

https://www.mycompiler.io/ko/new/c

 

새 C 프로그램 만들기 - 마이컴파일러 - myCompiler

실행 코드 코드 저장 기존 코드를 유지하시겠습니까? 에디터에 코드가 있는 동안 언어를 전환하려고 합니다. 이를 유지하려면 “기존 코드 유지”를 선택합니다. 예제로 바꾸려면 “예제로 바

www.mycompiler.io

 

1번

#include <stdio.h> 
int main ()
{
    int n = 123456789; int nf, ng;
    float f;
    double g;
    f = (float) n;
    g = (double) n;
    nf = (int) f;
    ng = (int) g;
    printf("nf=%d ng=%d\n", nf, ng);
}

/// >>> nf=123456792 ng=123456789

 

이러한 결과가 도출된 과정 :

float는 단일 정밀도 부동 소수점 형식이며, 길이는 32비트이다. 따라서 7행에서 n float형으로 변환되는 경우, float의 정밀도가 123456789보다 작아 float형으로 변환하는 과정에서 정밀도가 낮은 숫자들이 반올림된다. 따라서123456792로 변환된다.

Double float보다 길이(64비트)와 정밀도가 크며 123456789를 담기에 충분하므로(123456789 53비트 이하의 크기이므로) 그대로 변환된다.


2번

#include <stdio.h> 
int main ()
{
	double d;
	d = 1.0 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1;
	printf ("d = %.20f\n", d); 
}

// >>> d = 2.00000000000000088818

 

이러한 결과가 도출된 과정 :

십진수 0.1 1/10,  x/2^k 꼴이 아니므로, 십진수 0.1은 이진 소수로 정확하게 표현할 수 없다. 따라서 근삿값으로 저장된 0.1의 오차들이 누적되어 위 코드에 주어진 0.1들만의 합계는 1.0보다 크게 된다.


3번

#include <stdio.h> 
int main ()
{
	float f1 = (3.14 + 1e20) - 1e20; 
    float f2 = 3.14 + (1e20 - 1e20); 
    printf ("f1 = %f, f2 = %f\n", f1, f2);
}

// f1 = 0.000000, f2 = 3.140000

 

이러한 결과가 도출된 과정 :

이는 부동소수점의 산술 과정에서 도출된 결과이다.  

f1에서 (3.14 + 1e20) 의 경우, 매우 큰 숫자인 1e20에 훨씬 작은 숫자인 3.14는 합에 영향을 주지 않는다. 따라서 (3.14 + 1e20) = 1e20이 된다. 따라서 f1 = (3.14 + 1e20) - 1e20 = 1e20 – 1e20 = 0.000000 이다.

f2에서 (1e20 – 1e20)  0이다. 따라서 3.14 + (1e20 – 1e20) = 3.14 + 0 = 3.140000 이다.