2016-09-02 3 views
0

Поскольку прямые сравнения с плавающей запятой являются рискованными, я пишу один класс-оболочку для проверки реляционных операций для чисел с плавающей запятой.Неожиданный результат, когда параметр non type template используется в программе без назначения локальной переменной?

#include<iostream> 
#include <cmath> 

template<unsigned int round_off_digits=10> 
class FloatRelationalOperators 
{ 
    private: 
     inline static double calcEpsilonValue() 
     {   

     int localVar=round_off_digits; 

     double withLocalVar=pow(10, (localVar * -1)); 
     double WithoutLocalVar=pow(10, (round_off_digits * -1)); 

     std::cout<<"withLocalVar: "<<withLocalVar<<" "<<"WithoutLocalVar :"<<WithoutLocalVar; 

     return WithoutLocalVar; 
     } 

    public: 

     inline static bool notequal(double a,double b) 
     { 
     double res=fabs(a-b); 

     if(res <= calcEpsilonValue()) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
     return false; 
     } 
}; 


int main() 
{ 
    FloatRelationalOperators<>::notequal(10.1,10.0); 
} 

Я пытаюсь вычислить значение epsilon от максимальных округлых цифр.

Когда я запустить программу, я получил результат следующим образом,

withLocalVar: 1e-10 WithoutLocalVar :inf 

Почему мой ответ неверен, когда параметр шаблона, не тип используется непосредственно в функции?

Я делаю что-то неправильно?

ответ

2

round_off_digits - значение без знака, и вы умножаете его на -1, что делает довольно большой неподписанный int. Если вы измените его на int работает

http://cpp.sh/8yflj

+0

Стыдно! спасибо –