Двойной объектный метод не принимает дробные значения? - PullRequest
1 голос
/ 10 сентября 2011

У меня проблемы с объектно-ориентированным скриптом C ++. Когда я создаю объект, я хочу вычислить AttributeQ на основе его атрибутов MyAValue, MyBValue и MyCValue.

При использовании отладчика Visual 2010 я заметил, что TempAttribueQ, кажется, всегда равен 0 (за исключением случаев, когда он, конечно, инициализируется). Если предположить Delta != 0, BVal == Maximum и DeltaA == DeltaC, то TempAttribueQ должно быть 1/3, а не 0.

Сначала я подумал, что это проблема области видимости, но переменная определена вне операторов if-else. Я попытался инициализировать TempAttribueQ как какое-то возмутительное число, которое оно сохраняет до операторов if-else, когда оно становится 0, когда этого не должно быть.

Это мой код ...

void SetMyAttribueQ(){

    double TempAVal = MyAValue;
    double TempBVal = MyBValue;
    double TempCVal = MyCValue;

    double Minimum = min(min(TempAVal, TempBVal), TempCVal);
    double Maximum = max(max(TempAVal, TempBVal), TempCVal);
    double Delta = Maximum - Minimum;

    double DeltaA = 0;
    double DeltaB = 0;
    double DeltaC = 0;

    double TempAttribueQ = 0;

    if(Delta == 0) {
        MyAttribueQ = TempAttribueQ; // this->SetMyAttribueQ(TempAttribueQ);
    }
    else {
        DeltaA = /* (a removed equation goes here... */
        DeltaB = /* (a removed equation goes here... */
        DeltaC = /* (a removed equation goes here... */

        if(AVal == Maximum)
            TempAttribueQ = (DeltaC - DeltaB);
        else if(BVal == Maximum)
            TempAttribueQ = (1/3) + (DeltaA - DeltaC);
        else
            TempAttribueQ = (2/3) + (DeltaB - DeltaA);

        MyAttribueQ = TempAttribueQ;
    }
}

Что мешает TempAttribueQ получить значение 1/3 или 2/3? Или, что заставляет его быть установлен на 0?

Ответы [ 4 ]

3 голосов
/ 10 сентября 2011

Когда вы делите одно целое число на другое, вы получаете целочисленный результат.Измените либо , либо обе константы на нецелые, чтобы исправить это - правила C ++ приведут к преобразованию другой переменной в число с плавающей запятой до того, как произойдет деление.Все следующее будет работать:

  • 1.0 / 3.0
  • 1 / 3.0
  • 1.0 / 3

Получится целое числопреобразовал обратно в двойное невидимое, поэтому вы не видели никаких ошибок в вашем коде.

2 голосов
/ 10 сентября 2011

1/3 == 0 из-за целочисленного деления, которое установлено на TempAttribueQ.

Вам нужно сделать 1./3, что приведет к 0.3333333..

2 голосов
/ 10 сентября 2011

Попробуйте 1.0 / 3.0 и 2.0 / 3.0.1/3 и 2/3 равны 0 из-за целочисленного деления.

2 голосов
/ 10 сентября 2011

1 - это целое число, 3 - это целое число, поэтому 1/3 использует целочисленную арифметику.

Вы хотите использовать 1.0/3.0 для принудительной арифметики двойной точности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...