Аналог в c++ для NormalizeDouble - страница 2

 
Integer:
AlexanderD:

Простите, не понял Вас. Поясните, пожалуйста.

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

Результаты округления я приводил ранее:

SimpleRoundTo(0.33265,-4) результат: 0.3326

SimpleRoundTo(0.33245,-4) результат: 0.3325

При неизменном RoundMode.

Соответственно, непонятно, что Вы имели ввиду: "Такой метод округления - если последняя пятерка, четные вниз, нечетные вверх"

 
AlexanderD:
Integer:
AlexanderD:

Простите, не понял Вас. Поясните, пожалуйста.

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

Результаты округления я приводил ранее:

SimpleRoundTo(0.33265,-4) результат: 0.3326

SimpleRoundTo(0.33245,-4) результат: 0.3325

При неизменном RoundMode.

Соответственно, непонятно, что Вы имели ввиду: "Такой метод округления - если последняя пятерка, четные вниз, нечетные вверх"


Ранее было вот так

SimpleRoundTo(0.33265,-4) результат: 0.3326

NormalizeDouble(0.33265,4) результат: 0.3327

 

Да, я объединил информацию из двух постов.


AlexanderD 18.04.2008 15:30правка | удалить

В большинстве случаев округляет верно, например:

SimpleRoundTo(0.33245,-4) результат:0.3325




 
Вобщем NormalizeDouble() округляет точно также, как всех учили в школе. Надеюсь вы справитесь.
 

Да, только NormalizeDouble() нет в C++, а имеющийся там SimpleRoundTo() некоторые значения округляет не по правилам.

Я и просил подсказать аналог NormalizeDouble() для C++.

Спасибо.

 
AlexanderD:

Здравствуйте!

Подскажите, пожалуйста, функцию для округления в c++, такую же точную, как NormalizeDouble() в MQL.

Результат SimpleRoundTo в ряде случаев не совпадает с NormalizeDouble().

Спасибо!

double NormalizeDouble(double x, int precision)
{
int sign;
double power10, temp_x, result;

/* Determine the sign of x */
if (x < 0) sign = -1 ; else sign = 1 ;

if (precision >= 0) /* good precision */
{
power10 = pow(10.0, (double)precision);

/* Work with absolute value of x so that
floor can be used regardless of x's sign */
temp_x = fabs(x) * power10;

/* Adding the 0.5 causes the rounding */
result = sign * floor(temp_x + 0.5) / power10;

return(result);
}
else /* bogus precision */
{
printf("Error: negative precision\n");
return(x);
}
}


sam ispolzuju v testovix imitacijax - bezosibocno

 

Спасибо. Использовал этот принцип, но более простой вариант. К сожалению, слишком медленно работает.

В dll-эксперте много сравнений расчетных уровней цен и нужно часто округлять.

 
AlexanderD:

Спасибо. Использовал этот принцип, но более простой вариант. К сожалению, слишком медленно работает.

В dll-эксперте много сравнений расчетных уровней цен и нужно часто округлять.

Посмотрите вот сдесь https://forum.mql4.com/ru/8314/page5. Я как раз пытался оценить для себя порядок скорости работы разных конструкций.

 
VBAG:
AlexanderD:

Спасибо. Использовал этот принцип, но более простой вариант. К сожалению, слишком медленно работает.

В dll-эксперте много сравнений расчетных уровней цен и нужно часто округлять.

Посмотрите вот сдесь https://forum.mql4.com/ru/8314/page5. Я как раз пытался оценить для себя порядок скорости работы разных конструкций.


Jesli verit, sto predlozanaja v statje NormalizeDouble takaja ze pravilnaja kak moja, togda potverzdaju, sto moja funkcija medleneje.

Test provodil tak:


double OtherNormalizeDouble(double value, int digits)
{
int factor = (int)round( pow(10.0, (double)digits) ); // factor - ??? ?????????,
//? ??????? ???????? ?? ?? VALUE ??????? ????? ?????
double result = round((double)factor * value) / (double)factor;
return(result);
}

{
clock_t rstart = clock();

fprintf( stdout, "rounding test\n" );
for( int i=0; i<10000000; i++ )
double res = NormalizeDouble( rand()%1000000 / clock(), 8 );

clock_t rfinish = clock();
double round_processing_time = ((rfinish - rstart)/(double)CLOCKS_PER_SEC)*1000;
fprintf( stdout, "Test took %.2f ms\n", round_processing_time );
}
{
clock_t rstart = clock();

fprintf( stdout, "rounding test\n" );
for( int i=0; i<10000000; i++ )
double res = OtherNormalizeDouble( rand()%1000000 / clock(), 8 );

clock_t rfinish = clock();
double round_processing_time = ((rfinish - rstart)/(double)CLOCKS_PER_SEC)*1000;
fprintf( stdout, "Test took %.2f ms\n", round_processing_time );
}


rounding test - my
Test took 5027.00 ms

rounding test - other
Test took 4767.00 ms

 
AlexanderD:

 

В dll-эксперте много сравнений расчетных уровней цен и нужно часто округлять.

???????? А что мешает взять модуль разности и сравнить с половинным размером пункта (0,5*Point) ?


Успехов.