램은 유한한 크기의 비트만 저장할 수 있어서 문제가 발생할 수 있다.
#include <cs50.h>
#include <stdio.h>
int main(void)
{
// 사용자에게 x 값 받기
float x = get_float("x: ");
// 사용자에게 y 값 받기
float y = get_float("y: ");
// 나눗셈 후 소수점 50자리까지 출력
printf("x / y = %.50f\n", x / y);
}
x = 1, y = 10
0.10000000149011611938476562500000000000000000000000
float
에서 저장 가능한 비트 수가 유한하기 때문에 위와 같은 오류가 발생
1부터 2를 계속해서 곱하여 출력
#include <stdio.h>
#include <unistd.h>
int main(void)
{
for (int i = 1; ; i *= 2)
{
printf("%i\n", i);
// 1초 휴식
sleep(1);
}
}
저장 가능한 수를 넘어가면 0이 출력된다.
그때 당시의 저장메모리는 비쌌기 때문에 네자리(1999)가 아닌 두자리(99)를 사용했고 2000년이 되면 99다음으로 100이 와야하지만 두자리만 저장하기 때문에 오버플로우가 발생해서 2000년이 아닌 1900년으로 인식된다는 문제였다.
보잉787은 소프트웨어 설계상 248일이 지나면 오버플로우가 발생하여 모든 전력이 끊어지는 문제가 있었다.
문제를 해결하기 위해 보잉은 주기적으로 변수 초기화를 위해 시스템을 재가동 했다.
주기적으로 자동으로 변수가 초기화하는 방법은 없었을까??