Здравствуйте, XJess, Вы писали:
XJ>Здравствуйте, Lloyd, Вы писали:
XJ>>>Вот в С++ лучше не стоит...
L>>С "==" не путаете?
XJ>Может, я что-то и путаю... Но тут же и равенство тоже проверяется...
Плохо строго сравнивать на равенство (неравенство) два числа с плавающей запятой. Все остальные случаи вполне имеют право на жизнь.
Добрый вечер всем!
Есть такой вот конструктор в классе (написан не мной), который, видимо, радианы переводит в градусы, минуты и секунды. Никак не могу понять, что товарищ хотел сказать строчкой if (_sec >= 59.999999)... Что, например, будет, если у меня _sec будет 59.9999999, тогда условие выполнится и переменная обнулится... Кстати, в C# можно так запросто double сравнивать с помощью >=? Вот в С++ лучше не стоит... Вообщем, что скажете? Это нормальный код? Как, кстати, правильно сравнивать Double-ы? С помощью Double.CompareTo?
public class Angle
{
double _radianValue;
int _sign;
int _deg;
int _min;
double _sec;
public Angle(double radianValue)
{
_radianValue = radianValue;
double degValue = _radianValue * 180 / Math.PI;
_sign = Math.Sign(degValue);
double ddeg = Math.Abs(degValue);
_deg = (int)Math.Floor(ddeg);
double dmin = (ddeg - Math.Floor(ddeg)) * 60;
_min = (int)Math.Floor(dmin);
_sec = (dmin - Math.Floor(dmin)) * 60;
if (_sec >= 59.999999)
{
_sec = 0;
_min++;
if (_min >= 60)
{
_min = 0;
_deg++;
}
}
}
...
}
Здравствуйте, XJess, Вы писали:
XJ>Есть такой вот конструктор в классе (написан не мной), который, видимо, радианы переводит в градусы, минуты и секунды. Никак не могу понять, что товарищ хотел сказать строчкой if (_sec >= 59.999999)... Что, например, будет, если у меня _sec будет 59.9999999, тогда условие выполнится и переменная обнулится...
Это частый прием. Переводится на русский примерно как "результат со всеми значащими знаками больше-равно 60". Из криминала здесь только встроенный magic number.
60 как double оно, конечно, не ровно 60, но отличия от ровно 60 там в далеких знаках. Только я бы просто > без = использовал.
Здравствуйте, XJess, Вы писали:
XJ>Добрый вечер всем! XJ>Никак не могу понять, что товарищ хотел сказать строчкой if (_sec >= 59.999999)...
Судя по всему, автор кода напоролся на случай, когда значение секунд (оно, в отличие от градусов и минут, вещественное!) из-за погрешности вычислений, оказывается >= 60.0
Вот и вставил такую не очень красивую проверку.
Совет: напишите на этот конструктор юнит-тесты — в том числе, чтобы этот if срабатывал.
Ну а потом уже можно попробовать переписать этот кусочек более красиво.
Правда, в нашем случае речь идёт про конкретную предметную область (координаты), поэтому вполне уместно вручную задать какую-то фиксированную абсолютную погрешность вычислений.