c++기초플러스하는데 개어렵네 씨팔 괜히샀나 싶다. 걍 설명처하면되는데 씨발 뭔 버전이니 뭐니 존나 따지니까 설명에 일관성이 없는거같음 데이터 부분공부하는데
존나 헷갈림 이버전 저버전 얘기 자꾸 처하니까
어떤 시스템에서는 이렇고 어떤시스템에서는 저렇게 시팔 일관성이 없어 개좆같네
암튼 형님들 질문들어가면 부동소수점부부인데
float a = 2.34E + 22f;
float b = a+ 1.0f;
여기서 b는 a에 1을 더한거잖아여 a는 23자리 숫자인데 b는 이 23세번째 수에 1을 더한건데
출력해보니 더한결과가 안나오는데, 책에서도 아무런 효과를 갖지 못한다는데 이유가뭐임?
float은 4바이트라 이 숫자 표현하기에는 넘 커서 1을 더해도 소용없는거임?
책에서 float형은 처음 6개또는 7개의 숫자까지만 나타낼수있다는데 4바이트라 23자리까지는 아니더라도 아주큰수까지 표현가능할텐데 왜 앞에 6~7개라고하는거임?
부동소수점은 1234567890 이란 숫자가 있으면. 1.23456 * 10^10 이런식으로 표현되는거라서. 끝에 숫자가 잘려나감. 그러니 1을 더해봤자. 잘려나가는 것 때문에 숫자 변화가 없음. 보통 이 자리수가 6개랑 15개가 있다는거 같은데...
음.. 내가 하는 말에 확신이 없다. 더 찾아보셈..
4바이트 정수가 9자리조차 다 표시도 못해. 그런데 그 바이트 중에서 일부는 지수로 쓰고있음. 그러면 정밀도가 6~7 자리 정도밖에 안나오지
ㄴ203.229 형님 형님말은 그럼 1234567899999999999999이 숫자와 1237890 이 두숫자가 있어도 float은 큰수는 부동소수점으로 표현되니까 1234567899999999999나 1234567890이나 똑같다는 말이져?
1xrgb 형님 좀 자세하게 설명가능하신가여 머리가 나빠서
내가 위에쓴 말이 맞는말인가..
음 일단 수를 ?.??? x 10^?? 처럼 나타낸다고 치자고
그러면 10은 1.000 * 10^01 이겠죠?
그러면 1234라는 수는 1.234 * 10^03 이겠네요
그런데 누가 여기에 0.1을 더했어요 그러면 1234.1 이 되는데 다시 표현하면 1.234 * 10^03 (가장 가까운 곳으로 반올림)이 되니까 변화가 없겠죠?
float의 정밀도는 6~7자리 정도죠? 그래서 원래 수보다 훨씬 작은걸 더하면 표현이 안된다고
형님 실례지만 더해서 0.1이면 1234.1에서 1.2341 * 10^03으로 표현가능하지 않습니까?
?.??? 이잖아요...
쓸 칸이 4자리 밖에 없으면 저렇게 못쓰죠
아 위에 물음표로 소숫좀 아래가 세칸이라고 가정을하신거군요
float의 경우 지수부 (10 ^ ?? 부분) 8비트, 가수부 (?.??? 부분) 23비트입니다. 23비트면, (2^23 해보시면 알겠지만) 10진법으로 따지면 6~7 자리정도밖에 표현이 안되여
그러니까 한정된 공간에 집어넣으려면 결국 계산후에 잘라내야하고, 이거 때문에 값이 실질적으로 차이가 나지 않는다는거죠
이런거 하면 꼭 읽어봐야 하는 문서가 있는데
https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
나중에 이해가 됬다고 생각하면 읽으시면됨
23비트가 6~7자리정도면 float형 변수에 6~7자리 정도는 그냥 일반 정수처럼 표현되고 8자리이상되면 부동소수점으로 표현된다는 말씀이죠?
아니요 항상 부동소수점으로 표시해요
그럼 소숫점 아래로는 몇번째 자리까지 표현이 되나요?
형님 그런데 제가 방금 123456 6자리 숫자를 출력해보고오니 그대로 정수형으로 출력합니당..
그게 무슨소리인지 이해가 안가요
내부에 저장할때 부동소수점으로 저장한다고요
님 정수도 2진법으로 저장하는데 출력할때 2진법으로 나오나요? 그거 printf가 처리해주는거임
그러니까 가수부분이 위에서 말씀하셨듯이 6~7자리까지 밖에 표현안된다고하셔서 제가 방금 float형 변수에 123456을 입력했는데 출력결과도 123456 으로 나오고 1234567 7자리 입력하니 그때부터는 부동소수점으로 표현됩니당..
c++이에여형님
cout 이 그렇게 처리를하는거에요
1234567 입력하니 1.234567+e+006 일케 나오네여
그게 내부랑 상관없다고요.. cout이 그냥 그런식으로 변환해주는거라고요...
항상 부동소수점으로 표시한다는게 내부에 말씀하시는건가여 출력은 별개죠?
제가 멍청해서..ㅈㅅ;
그러니까 내부에 (메모리에) 저장할때 항상 부동소수점 형식으로 저장합니다
그리고 출력할때는 cout이나 printf 같은 얘들이 메모리를 읽고 이쁘게 출력해줍니다
그럼 출력할떄 123456 일케 정수형식으로 나오는건 정상이져?
만약 그런거 없었으면 님 정수 찍을때도 맨날 16진법 봐야함
정수형식이라는건 없어요 2.5 써도 2.5로 나올걸요 그냥 뒤에 달려있는 0을 때주는거죠
그리고 cout 동작을 왜 저에게 물어봐요? c++ ref 참고하세요
ㅠㅠ넹 어렵네여
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ개꿀잼