#11 - 제곱근(2) [쉬움]

2019. 1. 6. 15:17카테고리 없음

728x90

문제

직각삼각형에서 직각을 이루는 두 변의 길이를 입력받고, 함수를 통해 빗변의 길이를 반환값으로 돌려받아 출력하는 프로그램을 작성하시오. 이 함수의 매개변수 및 반환값은 double로 하시오.


        이전 프로그램의 경우, 화면에 출력된 값이 실제 빗변의 길이와 다소 오차가 존재했다. 그것은 double 자료형이 제한된 용량을 갖고 있고, 또 실제로 화면에 출력할 수 있는 정도에도 분명한 한계가 있기 때문이다. 무한한 성격의 실수를 표현해야하기 때문에 발생하는 불가피한 한계에도 불구하고 화면에 출력된 값을 충분히 신뢰할 수 있기 위해서는 적어도 출력값이 double의 유효숫자 안에서만 표현되어야 한다. 다음은 이러한 한계점을 보완하기 위해 출력 방법을 보완한 프로그램이다.


핵심 아이디어

ㅡ 제곱과 제곱근

ㅡ 실수와 근삿값 (double 자료형의 유효숫자 15)




※ 결과

ㅡ 기존의 프로그램은 매우 큰 수나 매우 작은 수를 입력했을 때, 유효숫자가 15인 double 자료형의 특징 때문에 출력된 값을 어느 정도까지 신뢰해야하는지 불분명한 문제점이 있었다. 

ㅡ 본 프로그램에서는 너무 큰 수를 입력했을 경우, 초기에 제시한 적당한 구간 내에 값을 입력하도록 요구하고, 너무 작은 수를 입력했을 때에는 main 함수의 반환값을 통해 빗변 길이의 가수의 크기를 제시하여 직접 유효숫자를 통한 판단을 가능케 한다.


<main 함수>

Inab_Outc 함수는 직각삼각형에서 빗변이 아닌 두 변의 길이를 입력받고, 빗변의 길이를 반환한다.
Error_correction 함수는 매개변수로 받은 값의 크기와 double의 유효숫자를 고려하여 switch문으로 경우에 맞게 출력한다. 정해놓은 case에 해당하면 0을 반환하지만, 그렇지 않은 경우 매개변수 값의 자릿수를 반환한다.



※ 내부 함수

1. endl 함수

ㅡ printf("\n")으로 출력시 줄바꿈을 수행한다. 내용에 직접적인 연관은 없다.


2. Inab_Outc 함수


ㅡ 기존에는 ab , 두 개의 변수를 선언하고 따로따로 입력받았지만, 두 변수의 속성이 서로 같기 때문에 하나의 배열을 선언하여 값을 차례대로 입력받는 것도 가능하다.

ㅡ 만약 계산되어 나온 빗변의 길이 c가 double의 유효숫자 이상, 즉 10^15 이상의 값을 가지면 다시 입력하도록 하고, 적절한 값으로 판단되면 반환한다.


3. Error_correction 함수

 

 매개변수로 입력받은 빗변의 길이 result 를 10^k 로 나누면서 자릿수를 판단한다.

ㅡ 그렇게 판단한 자릿수와 유효숫자 15를 고려하여 각 case에 알맞은 출력을 진행한다.

 



주요 문법

ㅡ <math.h> 헤더파일에 존재하는 sqrt(k), pow(a, b) 함수 활용

ㅡ do while 문으로 조건에 맞는 입력값 받기

ㅡ switch case 문으로 각기 다른 경우를 다루기


 


728x90