【问题标题】:Sign calculation in c++c++中的符号计算
【发布时间】:2014-02-11 11:25:48
【问题描述】:

我正在尝试将纬度和经度从度、分、秒转换为十进制度数。我已正确转换了数字,但在转换符号时遇到了麻烦。当我输入纬度数字 39 57 21 和经度数字 -75 11 14 时,它会正确转换为 (39.9558, 75.1872) 但我的符号计算公式无法正常工作。我用细齿梳检查了代码,但似乎在我的公式中找不到错误。我得到的公式是:sign=(2x)/(abs(x)+1)。我在下面包含了我的代码。任何帮助将不胜感激。

#include <iomanip>
#include <cmath>
#include <iostream>
#include <string>
using namespace std;

int main()
{
    int user_degrees_latitude, user_minutes_latitude, user_seconds_latitude,
        user_degrees_longitude, user_minutes_longitude, user_seconds_longitude,
        sign_latitude, sign_longitude;
    double total_minutes_latitude, total_degrees_latitude,
        total_minutes_longitude, total_degrees_longitude, final_latitude,
        final_longitude;
    const double sixtieth = (1. / 60);

    cout << "Input latitude in degrees, minutes, seconds:";
    cin >> user_degrees_latitude >> user_minutes_latitude >>
        user_seconds_latitude;

    cout << "Input longitude in degrees, minutes, seconds:";
    cin >> user_degrees_longitude >> user_minutes_longitude >>
        user_seconds_longitude;

    total_minutes_latitude =
        (user_minutes_latitude + ((sixtieth) * user_seconds_latitude));
    total_degrees_latitude =
        (abs(user_degrees_latitude) + ((sixtieth) * total_minutes_latitude));

    total_minutes_longitude =
        (user_minutes_longitude + ((sixtieth) * user_seconds_longitude));
    total_degrees_longitude =
        (abs(user_degrees_longitude) + ((sixtieth) * total_minutes_longitude));

    sign_latitude =
        (2 * (total_degrees_latitude)) / ((abs(total_degrees_latitude)) + 1);
    sign_longitude =
        (2 * (total_degrees_longitude)) / ((abs(total_degrees_longitude)) + 1);

    final_latitude = (sign_latitude * total_degrees_latitude);
    final_longitude = (sign_longitude * total_degrees_longitude);

    cout << user_degrees_latitude << " deg " << user_minutes_latitude << "\' "
         << user_seconds_latitude << "\" latitude, " << user_degrees_longitude
         << " deg " << user_minutes_longitude << "\' " << user_seconds_longitude
         << "\"";
    cout << " is (" << total_degrees_latitude << "," << total_degrees_longitude
         << ")" << endl;

    return 0;
}

【问题讨论】:

  • 一个简短的测试用例而不是所有的代码会很好。
  • 好吧,也许你的公式是错误的?
  • 这与您之前发布的代码基本相同。您会发现使用调试器比让 SO 为您调试它对您的帮助要大得多。
  • 您正在计算total_degrees_longitude 的符号,它是通过绝对值计算的。它总是正的,所以计算的符号当然总是正的。另外,你的符号公式很奇怪,而且是错误的。 sign(0.5) = 1/(abs(0.5)+1) = 0.66???
  • std::signbit(),来自cmath

标签: c++ latitude-longitude


【解决方案1】:

首先,尝试一个更好的计算符号的函数,例如:

double sign(double x) {return (x < 0) ? -1 : 1;}

其次,由于只有变量 user_degrees_latitudeuser_degrees_longitude 永远是负数,所以只有在获得大小后才应该使用它们来计算最后的符号。

sign_latitude  = sign(user_degrees_latitude);
sign_longitude = sign(user_degrees_longitude);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    相关资源
    最近更新 更多