#include <stdio.h>
int main()
{
int a, b;
char c;
printf("1. 숫자 2.기호 3. 숫자 : ");
scanf("%d %c %d", &a,&c,&b);
switch (c) {
case '+' : printf("%d %c %d = %d", a, c, b, a+b);
break;
case '-' : printf("%d %c %d = %d", a, c, b, a-b);
break;
case '*' : printf("%d %c %d = %d", a, c, b, a*b);
break;
case '/' : printf("%d %c %d = %f", a, c, b, (double)a/b);
break;
}
return 0;
float보단 double이 쓰는게 좋다 어쩌구 하던데
머가 좋은거죠 왜좋은건가요
doube 15자리 float 7자리 유효숫자 떄문인가요?
모든건 정확도때문입니다
언어에 따라서는 값자기 출력값이 커지거나 풀이 늘어나면 쓰래기값이 들어가는 경우가 있음 특히나 소수점 아랫자리에 그래서 플롯보다 더블이 좋다는건 조금 말이 이상하고 소수점 아래를 사용하지 않는경우, 실수가 아니라 정수만 다루는 경우는 정수형을 사용하는게 좋음
어차피 결국 printf에 출력할 때는 내부적으로 double로 변환되게 되어 있어. double은 float에 비해 정밀도가 대략 2배 정도지. 메모리 아낀다고 float 캐스팅하더라도 printf에 가변 인자로 값을 넘기는 순간 내부적으로 무조건 double로 변환해서 넘기도록 되어 있어서 float으로 캐스팅해서 연산하는 게 뻘짓이고 정밀도만 낮아짐.
그래서 printf에서 실수 출력할 때 float, double 가리지 않고 %f로 지정하는 이유가 내부적으로 둘 다 double로 변환되어서 들어가기 때문이야.
와우
감사요 이해했어요
printf는 모르겠고, float은 4바이트(32비트) 데이터형인데, double은 8바이트(64비트) 데이터형이다. 굳이 필요없는데서 double 쓰면 그만큼 느려지는거임. 사실상 32비트 프로그램이 대부분이니... 그리고 정확도 따지려면 차라리 int형 쓰는게 나음. 실수형은 연산하면 수학적으로는 똑같지만, '이진법적으로는' 다른 숫자가 나오기 쉬움. 이건 double이고 float이고 나발이고 똑같음. '똑같이 다름'. 보통사람도 이런거 자주볼수 있는게 엑셀이다. 엑셀에서 소숫점 실수연산 쳐하고 if돌렸더니 다르더라 이런거 많음. 시트건 VBA건 똑같음. 이건 이진법이론 자체의 한계임.
즉, 위에서 유효숫자 말했는데, 유효숫자 7자리 미만으로 떡을치면 왠만하면 float쓰는게 낫고, 정확도 고려하려면 int에 소숫점 무시하고 넣어야함. 아예 소수점 자리를 정해놓고 쓰는거지. 3자리 제한할거면 123.456 은 그냥 123456이라는 int숫자로, 78.91이면 78910 이런식으로. 안그러면 if문 쓸때 존나 귀찮아짐. 자릿수 제한 못하는 상황이면, if(절대값(a-b)<0.00001) 이 조건이 a == b 로 처리되는 식으로 짜야함. 이러면 연산단계가 늘어나고, 가독성 떨어져서 좆같아짐.
double은 8바이트니 32비트 프로세서에서 double 형을 쓰면 느리다? 이 넘은 부동 소수점 연산은 x87 보조 프로세서에서 처리된다는 걸 전혀 모르는 넘이네(뭐 물론 모듈화돼서 지금은 CPU에 기본 탑재되어 있다만 정수 연산을 처리하는 곳과 실수 연산을 처리하는 곳은 다르다) ㅉㅉ 32비트가 아니라 16비트라고 쳐도 double 형 연산은 하드웨어적으로 지원이 됐단다 아가야. CPU가 16비트니 32비트니 64비트니 하는 건 정수 연산 처리 능력을 말하는 거고 부동 소수점 연산은 따로 하드웨어적으로 모듈이 들어있어서 저거랑 전혀 상관이 없어.