Это хорошая идея, чтобы сравнить double.MaxValue на равенство? - PullRequest
7 голосов
/ 22 апреля 2011

Тот же вопрос можно задать для float ... или MinValue.

Я думаю об использовании этого как особого значения. Буду ли я видеть ошибки из-за точности? Я не рассчитываю делать арифметику с этими числами, просто установите их и все.

Уточнение: я использую это для дозорного значения.

Это то, что описано в спецификации C #?

Ответы [ 5 ]

10 голосов
/ 22 апреля 2011

Это зависит от того, как вы его используете.

Если вы используете double.MaxValue в качестве значения токена или часового, которое имеет особую семантику, тогда да, это просто битовый шаблон, с которым вы сравниваете,Например, вы можете использовать double.MaxValue, чтобы указать «неинициализированное» или «неизвестное» значение.Есть и другие способы сделать это (например, с помощью nullable double?), но использование double.MaxValue также разумно, если в вашем домене значение не встречается естественным образом.

Если у вас есть произвольный double значение, и вы хотите увидеть, равно ли оно "double.MaxValue", тогда вы захотите увидеть, находятся ли числа в некотором небольшом диапазоне (эпсилон) друг от друга, так как некоторая точность могла быть потеряна, когдавычисление вашего другого double значения.Здесь необходимо знать о значениях, выходящих за пределы double.MaxValue, что создает ситуацию переполнения.

2 голосов
/ 22 апреля 2011

Если вы сравните double.MaxValue с double.MaxValue, да, они будут одинаковыми. Бинарное представление идентично, проблем не будет. Если, с другой стороны, вы пытаетесь что-то вроде:

double myDouble = (double.MaxValue - 3.1415) / 2;
if((myDouble * 2) + 3.1415 == double.MaxValue)
{
    ...
}

тогда да, вы, вероятно, начнете видеть странные проблемы с точностью.

Ниже приведены специальные константы, которые нельзя сравнивать с самими собой. Все остальное - честная игра.

  • NaN
  • NegativeInfinity
  • PositiveInfinity
1 голос
/ 22 апреля 2011

Если вам нужно «специальное» значение, я бы предложил использовать Nullable вместо:

double? val = ...;

if(val.HasValue)
    // do something with val.Value
1 голос
/ 22 апреля 2011

Использование «специальных значений», как правило, плохая практика.Я бы предпочел использовать объект с каким-то кодом статуса, а затем двойным (/ float / что угодно), который заполняется, только если статус не является исключительным.

public class CalcNumber
{
    public CalcNumberStatus Status {get; private set;}
    public double Value {get; private set;}


    public CalcNumber(double value)
    {
        Status = CalcNumberStatus.Normal;
        Value = value;
    }

    public CalcNumber(CalcNumberStatus status)
    {
        if(status == CalcNumberStatus.Normal)
        {
            throw new Exception("Cannot create a normal CalcNumber without a value");
        }
        Status = status;
        Value = 0;
    }
}
public enum CalcNumberStatus 
{
    Normal,
    Error
}

Вы могли бы даже сделать некоторыеПричудливая перегрузка операторов для простого преобразования и арифметики, если вам нужно.

Относительно проблем точности, поскольку кажется, что вы не планируете делать арифметику с этим числом, поэтому вам не следует сталкиваться с проблемами точностикоторые мешают проверке на равенство.

0 голосов
/ 22 апреля 2011

Я не думаю, что это должно быть проблемой. У меня нет технического объяснения, но я много раз использовал MaxValue или MinValue для сравнения, и это никогда не было проблемой.

...