하드웨어의 한계
하드웨어의 한계
Ram: 프로그램이 작동할 때 모든 것들이 저장되는 곳.
하지만, 램의 성능은 유한.
예를들면, 수를 무한대까지 셀 수 없다. 그 뜻은, 연산에도 한계가 있다는 뜻.
형식지정자를 쓸 때, 정해진 소주점 자리 수 만큼만 나타내기
%.1f // 소수점 한자리
%.10f // 소수점 10번째 자리까지
이 때 1 / 10
의 값을 소수점 50자리까지 프린트 해보면,
#include <cs50.h>
#include <stdio.h>
int main(void)
{
float x = get_float("x: ");
float y = get_float("y: ");
printf("x / y = %.50f\n", x / y);
}
희안하게도, 값이 1이 아니다.
이유는 뭘까?
컴퓨터 메모리 용량에 따라, 특정 값 이상을 계산할 수 없고, 특정 소수점 자리수 이상까지 저장할 수 없기때문.
float 대신 double을 썼다면 더 가까운 값을 표현했겠지만.
#include <cs50.h>
#include <stdio.h>
int main(void)
{
double x = get_float("x: ");
double y = get_float("y: ");
printf("x / y = %.50f\n", x / y);
}
컴퓨터는 완벽하지 않다. 그저 자신의 메모라 한계에서 가장 근사값을 찾아내는 것 뿐.
loop로 1에 2를 계속 곱해보자.
#include <stdio.h>
#include <unistd.h>
int main(void)
{
for (int i = 1; ; i *= 2)
{
printf("%i\n", i);
sleep(1);
}
}
결국에는 runtime error와 함께 리턴값으로 0이 나온다.
계속해서 숫자를 키워나가다보면, 더 이상 1조차 더할 비트가 없게 된다.
그 뜻은 컴퓨터는 소수점의 정확성, 정수의 크기에 한계가 있다는 뜻.
10진수에서 세자리 수까지만 쓸 수 있다면, 999 + 1은 뭐가 될까?
=> 000
그렇다면 2진수에서 3자리 까지만 쓸 수 있다면 2진수 111(십진수로 7)의 다음수는 뭐가될까?
=> 1000
하지만 "3bit까지만 쓸 수 있을때"로 가정해놨기에,여기서 111의 다음 수는 앞으로 가져온1을 읽어버리며 000이 된다.
이것이 바로 Overflow.
이렇듯 컴퓨터의 메모리는 한계가 있고, 그 한계를 넘어간 수는 저장할 수 없다.
2000년대로 넘어갈 때 Y2K로 일어났던 해프닝도 이 overflow에 근거를 두고 나왔던 얘기고, 최근 보잉 787기의 소프트웨어 결함으로 최초 시동이 켜지고 248일동안 계속 사용됐다면 이 overflow를 일으켜 모든 전력을 차단하는 심각한 결함이 있었다고 한다. 그래서 보잉에서 실제로 248일마다 비행기를 재부팅 했다고.. 바로, 안에 계산되고 있던 정수를 0으로 돌리기 위해(overflow를 막기위해!!)
출처 : [부스트코스] 모두를 위한 컴퓨터 과학 (CS50 2019) (https://www.edwith.org/boostcourse-cs-050)
Author And Source
이 문제에 관하여(하드웨어의 한계), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@srparkgogo/하드웨어의-한계저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)