【发布时间】:2012-10-23 20:02:49
【问题描述】:
如何提高以下的准确度(精度)?
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。
【问题讨论】:
-
哦,顺便说一句,我忘了注意结构: struct Degree_Minutes { signed int degree;签名的 int 分钟;双秒; };
-
请编辑帖子以包含此新信息。
-
没有必要包括 Degree_Minutes 的声明,因为它可以从提供的信息中推断出来。 (如果
minutes被声明为浮点数或seconds被声明为整数,则会得到不同的结果。) -
可能没有必要,但我认为最好是为了清晰。我知道还有很多像我一样的人仍在努力提高初出茅庐的技能。
标签: c++ floating-point precision floating-accuracy floating-point-precision