Скачать MetaTrader 5

Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения - страница 20

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Roman Konopelko
169
Roman Konopelko  
Sergey Dzyublik:

1. Устранить неоднозначность поведения:
Если передать "INT_MAX - 10" в качества параметра в CPrimeGenerator::ExpandPrime, то вернется результат "INT_MAX".
Если передать "INT_MAX - 10" в качества параметра в CPrimeGenerator::GetPrime, то вернется тот же результат: "INT_MAX - 10".

Так же в обоих случаях возвращаемое значение не является простым числом, что вводит пользователя в заблуждение.

По первому пункту:

Здесь нет никакой неоднозначности.

Метод GetPrime должен возвращать ближайшее сверху простое число, но на промежутке от INT_MAX - 10 до INT_MAX таковых нет, поэтому и возвращается INT_MAX - 10.

Метод ExpandPrime с начало удваивает входное значение и уже от полученного числа вызывается метод GetPrime.

Плюс к этому в ExpandPrime стоит проверка на выход за пределы INT_MAX:

   if((uint)new_size>INT_MAX && INT_MAX>old_size)
      return INT_MAX;
   else
      return GetPrime(new_size);

По моему логика поведения этих методов абсолютно однозначная и правильная.


Относительно второго и третьего пункта:

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

Sergey Dzyublik
5307
Sergey Dzyublik  
Roman Konopelko:

Здесь нет никакой неоднозначности.
Метод GetPrime должен возвращать ближайшее сверху простое число, но на промежутке от INT_MAX - 10 до INT_MAX таковых нет, поэтому и возвращается INT_MAX - 10.
Метод ExpandPrime с начало удваивает входное значение и уже от полученного числа вызывается метод GetPrime.
Плюс к этому в ExpandPrime стоит проверка на выход за пределы INT_MAX:
По моему логика поведения этих методов абсолютно однозначная и правильная.


1. Функции могут вернуть не простые числа, а непонятно какое числа. 
Как пользователь использует эти данные - это его проблемы, может он их в long кастит и дальше в супервычислительные функции передает, какая разница.
Факт заключается в том, что может возвращаться не то, что заявлено и ожидается по умолчанию от функций.

2. Как проверить, что в результате вызова функции вернулось простое число, а не что попало?
Просто сравнить с INT_MAX не получится.
Нужно сравнивать с последним доступным простым числом меньше INT_MAX.
Каждый раз сравнивать результат вызова этих функций с каким-то магическим числом, что бы убедиться что все работает верно - как по мне, это бред.

Roman Konopelko
169
Roman Konopelko  
Sergey Dzyublik:

1. Функции могут вернуть не простые числа, а непонятно какое числа. 
Как пользователь использует эти данные - это его проблемы, может он их в long кастит и дальше в супервычислительные функции передает, какая разница.
Факт заключается в том, что может возвращаться не то, что заявлено и ожидается по умолчанию от функций.

2. Как проверить, что в результате вызова функции вернулось простое число, а не что попало?
Просто сравнить с INT_MAX не получится.
Нужно сравнивать с последним доступным простым числом меньше INT_MAX.
Каждый раз сравнивать результат вызова этих функций с каким-то магическим числом, что бы убедиться что все работает верно - как по мне, это бред.

1. Ваш случай получения методом GetPrime не простого числа, пока что единственный, который я встречал. Данный инцидент будет исправлен путем изменения проверки при генерации простых чисел:

//--- outside of our predefined table
   for(int i=(min|1); i<=INT_MAX; i+=2)
     {
      if(IsPrime(i) && ((i-1)%s_hash_prime!=0))
         return(i);
     }
   return(min);

2. Для проверки числа на простоту реализован метод CPrimeGenerator::IsPrime

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий