Ошибки, баги, вопросы - страница 3488

 
Rorschach #:
Число 1.2265, казалось бы что проще превратить его в 122650, надо только передвинуть точку и вроде не должно быть потери точности. Как же я ошибался...
int ToInteger( const double Num, const double Alpha = 1e-5 )
{
  return((int)(Num + ((Num > 0) ? Alpha : -Alpha)));
}

void OnStart()
{
  Print((int)(1.2265 * 1e5));     // 122649
  Print(ToInteger(1.2265 * 1e5)); // 122650
}
 
fxsaber #:

а зачем нужна Alpha?
так достаточно

int Round(const double x) {
   return (int)(x+((x>0)?0.5:-0.5));
}
 
Nikolai Semko #:

а зачем нужна Alpha?
так достаточно

Иногда хочется, чтобы 1.6 приводилось к единице.

 
fxsaber #:

Иногда хочется, чтобы 1.6 приводилось к единице.

давно использую следующую троицу

int Ceil (const double x) {
   return (x-(int)x>0)?(int)x+1:(int)x;
}
//+------------------------------------------------------------------+
int Round(const double x) {
   return (int)(x+((x>0)?0.5:-0.5));
}
//+------------------------------------------------------------------+
int Floor(const double x) {
   return (x>0)?(int)x:((int)x-x>0)?(int)x-1:(int)x;
}

в данном случае используем Floor

 
Rorschach #:
Число 1.2265, казалось бы что проще превратить его в 122650, надо только передвинуть точку и вроде не должно быть потери точности.
Print((int)round(1.2265 * 100000)); //  122650

Вроде ничего не теряет.

 
Aleksandr Slavskii #:

Вроде ничего не теряет.

Главная проблема это производительность. Стандартная функция round() в несколько раз медленнее Round (), которую приводил выше.
 
Nikolai Semko #:

в данном случае используем Floor

К сожалению, она не подойдет для этого случая.

1.2265 * 1e5
 
Nikolai Semko #:
Главная проблема это производительность. Стандартная функция round() в несколько раз медленнее Round (), которую приводил выше.

Проверил)

Получилась в два с половиной раза штатная медленнее. 

 
Aleksandr Slavskii #:

Вроде ничего не теряет.

round уберите.

Умножение на 10 это изменить биты в экспоненте? Откуда 9 в периоде появляется?


 
Ошибка при выполнении:
class A {
    typedef void (*fn)(A*);
    static void g( A* a ) { a.i = 10; }
public:
    A() : i(5) {}
    void f() const { fn h = g; h( &this ); }
    int i;
};
void OnStart()
{
    const A a;
    Print( "Было:",  a.i );
    a.f();
    Print( "Стало:", a.i );
}

Было:   5

Стало: 10

Двойной (!) const не спас от изменения значения