如何提高以下内容的准确性(精确度)?
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.898556时,最终会以38.9134结束。
答案 0 :(得分:6)
由于意外的整数除法,您遇到了舍入/截断错误。要获得正确的双精度,您需要将degrees.minutes
和degrees.seconds
隐式转换为double
,如下所示:
double decimal = degrees.degrees + (degrees.minutes/60.0) + (degrees.seconds/3600.0);
请注意60
- &gt; 60.0
并在秒字段中更正60到3600。
答案 1 :(得分:2)
有两个问题。
首先,minutes
结构的Degree_Minutes
成员被声明为整数类型,因此degrees.minutes/60
将整数除以整数,从而产生截断的整数结果。将其更改为degrees.minutes/60.
会产生浮点结果。
其次,degrees.seconds/60
不正确。这应该是degrees.seconds/3600
或degrees.seconds/60
应添加到degrees.minutes,然后总和除以60.
答案 2 :(得分: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
,但我将其保留为原样来说明。