#include <stdio.h>
int main()
{
float f = 4096.0f;
size_t i = 0;
while (f <= 4097.0f) {
f += 1 / 4096.0f;
printf("4096 + %zu/4096 = %f\n", ++i, f);
}
return 0;
}
while 문 안에서 4096에 1/4096을 계속 더하면서 4097이 되면 종료되는 프로그램
하지만 4096에 아무리 1/4096을 더해도 4097이 되지 않는데...
잔인해
이런거는 취미임? 아니면 연구개발하면 기본 소양이 됨?
C를 배울때 알아야하는 기본상식이지
기본소양기준이 너무 빡센데요 교수님
float 최대값이 4096이야?? - dc App
아니 원래 딱뎀은 정밀도로 패쓰하고 오버플로우까지되어야 무한반복인데 저건 4097넘고 그냥 종료 아니냐 - dc App
아니면 !=4097로 하는거 아니었나 - dc App
부동소수점 원리에 대해 알아봐야될듯
4097넘어가면 소수부분이 줄어드는거 아님? - dc App
말하자면 4글자짜리 칸이 있을때 "100만" + "1만" = "101만"은 계산할 수 있지만 "100만" + "1" = "100억1"은 5글자니까 계산할 수 없는 것 같은 원리임
4글자로 표현할 수 있는 수들 중 1,000,001에 가장 가까운 건 "100만"이니까 결국 칸이 4글자라면 "100만" + "1" = "100만"이라고 계산하게 되지
오 이것도 있구나 - dc App
float는 총 정밀도가 24비트, 다시 말해서 첫번째 1 뒤로 이진법 23자리를 저장할 수 있음. 4096은 1 뒤에 0이 12개고, 1/4096은 0. (0이 11개) 1이라서, 이 두개를 더하면 1 (0이 12개).(0이 11개) 1 이니까 총 25비트가 되어서 마지막 1이 잘림
ㄱㅅㄱㅅ cs를 배운적이 없어성 - dc App
그런데 마지막 1이 잘리면 결국 다시 4096이 되잖어. 그러니까 float피셜로는 4096 + 1/4096 = 4096인거고 그래서 저 while문은 끝나지 않음
위에 예시에서 "100억1" → "100만1"로 수정