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; };

10進数から度/分/秒に変換してから10進数に戻すまでに、元の値が38.898556の場合は38.9134になります。

4

3 に答える 3

6

意図しない整数除算が原因で、丸め/切り捨てエラーが発生しています。適切な倍精度を取得するには、次のように暗黙的に変換degrees.minutesdegrees.secondsてに変換する必要があります。double

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

60->60.0と秒フィールドの60から3600の修正に注意してください。

于 2012-10-23T20:07:56.573 に答える
2

2つの問題があります。

まず、構造体のminutesメンバーがDegree_Minutes整数型として宣言されているため、degrees.minutes/60整数を整数で除算すると、切り捨てられた整数の結果が生成されます。これを変更するdegrees.minutes/60.と、浮動小数点の結果が得られます。

第二に、degrees.seconds/60正しくありません。これは、degrees.minutesに追加するdegrees.seconds/3600か、追加する必要があり、合計を60で除算します。degrees.seconds/60

于 2012-10-23T20:16:33.713 に答える
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;
}

あなたはほとんどそれを持っていました。(他の回答に示されているように)小数を明示的に指定して強制的に2分割する必要がありましたが、秒を60で2回除算する必要もありました。実際には、おそらくこれをdegrees.seconds/3600に変更しますが、説明のためにそのままにしておきます。

于 2012-10-23T20:16:05.260 に答える