코드네임 :
🖥️ 컴퓨터 구조 과제1 📚 본문
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 이다.
'⚙️Computer System > 컴퓨터구조' 카테고리의 다른 글
🖥️컴퓨터구조 과제 2 📚 (0) | 2024.04.05 |
---|---|
🖥️ 컴퓨터구조 RISC-V (0) | 2024.03.25 |
🖥️ 컴퓨터구조 Floating Points 부동소수점 (0) | 2024.03.19 |
🖥️ 컴퓨터구조 진수 변환과 곱셈기/나눗셈기 (0) | 2024.03.18 |
🖥️ 컴퓨터 구조 1주차 (0) | 2024.03.17 |