2

어떻게 다음의 정확도를 향상시킬 수 있습니까?코드의 정밀도를 향상시키는 방법

struct Degree_Minutes { signed int degrees; signed int minutes; double seconds; }; 
Degree_Minutes geo_dec_to_deg (double dec) 
{ 
    Degree_Minutes degrees_minutes; 
    signed int degrees, minutes; 
    double remainder, temp, seconds; 

    remainder = fmod(dec, 1); 
    degrees_minutes.degrees = dec - remainder; 
    temp = remainder*60; 
    remainder = fmod(temp,1); 
    degrees_minutes.minutes = temp-remainder; 
    degrees_minutes.seconds = remainder*60; 

    return degrees_minutes; 
} 

    double geo_deg_to_dec (Degree_Minutes degrees) 
{ 
    double decimal = degrees.degrees + (degrees.minutes/60) + (degrees.seconds/60); 
    return decimal; 
} 

int main(int argc, char **argv) 
{ 
    Degree_Minutes deg; 
    double decimal = 38.898556; 

    deg = geo_dec_to_deg(decimal); 
    cout << "Results of geo_dec_to_deg function: \n" << decimal << " was converted to " << deg.degrees << " degrees, " << deg.minutes << " minutes, " << deg.seconds << " seconds.\n"; 
    decimal = geo_deg_to_dec(deg); 
    cout << "Results of geo_dec_to_deg function: \n" << deg.degrees << " degrees, " << deg.minutes << " minutes, " << deg.seconds << " seconds was converted to " << decimal << "\n"; 

    return EXIT_SUCCESS; 
} 

편집 : 여기 구조체가 추가 깜빡 :

struct Degree_Minutes { signed int degrees; signed int minutes; double seconds; }; 

당신도/분/초 진수로 변환 시간으로는 다음 다시 당신이 38.9134와 바람 진수로 원본은 38.898556이었다.

+0

아, BTW 구조체에주의하지 않았습니다. struct Degree_Minutes {signed int degrees; signed int minutes; 2 초; }; –

+0

이 새 정보를 포함 할 소식을 수정하십시오. –

+0

제공된 정보에서 가능한대로 Degree_Minutes 선언을 포함 할 필요는 없습니다. ('minutes '이 부동 소수점으로 선언되었거나'seconds'가 정수로 선언 되었다면, 다른 결과가 얻어 질 것입니다.) –

답변

6

의도하지 않은 정수로 인해 반올림/잘림 오류가 발생합니다. ->60.0 및 초 필드에서 3600-60의 보정

double decimal = degrees.degrees + (degrees.minutes/60.0) + (degrees.seconds/3600.0); 

참고 60 : 당신이 암시 적으로 다음과 같이 doubledegrees.minutesdegrees.seconds을 변환 할 필요가 적절한 배정 밀도를 얻을 수 있습니다.

+2

그런 오류를 경고하는 컴파일러 옵션이 있습니다. gcc에 대해서는'-Wconversion'을, 실수하지 않으면 clang합니다. '-Wall'은 훨씬 나아졌습니다. :-) – Florian

+2

학위에는 3600 초가 있습니다. –

+0

아, 나는 .. 내가 서명 된 int를 사용함에있어 (왜 내가 몇 분 동안 서명했는지 확신 할 수 없다). 그래서 더블을 사용하면 변환해야합니다 .... 좋아, 이걸 시도해 봤는데, 원본에서 멀리 떨어져 있습니다. 다시 변환되면 39.7967 대 38.8985가됩니다. –

1
#include <stdlib.h> 
#include <iostream> 
#include <math.h> 

using namespace std; 

struct Degree_Minutes { signed int degrees; signed int minutes; double seconds; }; 

Degree_Minutes geo_dec_to_deg (double dec) 
{ 
    Degree_Minutes degrees_minutes; 
    signed int degrees, minutes; 
    double remainder, temp, seconds; 

    remainder = fmod(dec, 1); 
    degrees_minutes.degrees = dec - remainder; 
    temp = remainder*60.0; 
    remainder = fmod(temp,1); 
    degrees_minutes.minutes = temp-remainder; 
    degrees_minutes.seconds = remainder*60.0; 

    return degrees_minutes; 
} 

double geo_deg_to_dec (Degree_Minutes degrees) 
{ 
    double decimal = degrees.degrees + (degrees.minutes/60.0) + (degrees.seconds/60.0/60.0); 
    return decimal; 
} 

int main(int argc, char **argv) 
{ 
    Degree_Minutes deg; 
    double decimal = 38.898556; 

    deg = geo_dec_to_deg(decimal); 
    cout << "Results of geo_dec_to_deg function: \n" << decimal << " was converted to " << deg.degrees << " degrees, " << deg.minutes << " minutes, " << deg.seconds << " seconds.\n"; 
    cout << "This should be: 38deg 53' 54.801\"" << endl; 
    cout << endl; 
    decimal = geo_deg_to_dec(deg); 
    cout << "Results of geo_dec_to_deg function: \n" << deg.degrees << " degrees, " << deg.minutes << " minutes, " << deg.seconds << " seconds was converted to " << decimal << "\n"; 
    cout << "This should be: 38.898556" << endl; 

    return EXIT_SUCCESS; 
} 

거의 들었습니다. 십진수를 명시 적으로 지정하여 강제로 두 번 나누어야했지만 (또한 다른 답에 표시된대로) 초를 60으로 두 번 나누어야했습니다. 실제로, 나는 아마 이것을 degrees.seconds/3600으로 바꿀 것이지만, 설명대로 그대로 남겨 두었습니다.

2

두 가지 문제점이 있습니다.

먼저 Degree_Minutes 구조체의 minutes 구성원은 정수 유형으로 선언되므로 degrees.minutes/60은 정수로 나누고 자른 정수 결과를 생성합니다. 이것을 degrees.minutes/60.으로 변경하면 부동 소수점 결과가 생성됩니다.

두 번째로 degrees.seconds/60이 잘못되었습니다. 어느 쪽이든 degrees.seconds/3600 또는 degrees.seconds/60이 degrees.minutes에 더해져 합계가 60으로 나눠 져야합니다.

관련 문제