НЕ РАБОТАЕТ MathMod !!! - страница 3

 
stringo:

Опять за рыбу деньги. С самого начала о чём разговор был? О входных параметрах. В Вашем случае на входе не ровно 0.8, а 0.80000000000000004 (4 в 17-м знаке после запятой, дебагер от вижуал студио мне показал)

Добро пожаловать в мир вещественных чисел.

Если Вам это не нравится (явно не нравится) переводите все Ваши вычисления на целочисленную основу.


Print( MathMod(5, 0.1)) выдает 0.1. Когда должен 0.0999. Может уже пора исправить ошибку, а не философствовать нам о мирах, особенно когда они исключительно в двоичной системе исчисления, а не вещественные !!!

 
stringo:

... переводите все Ваши вычисления на целочисленную основу.

Благодарю...
 
xenon13 писал (а):
Может уже пора исправить ошибку, а не философствовать нам о мирах, особенно когда они исключительно в двоичной системе исчисления, а не вещественные !!!
Бросьте, xenon13, на бан нарвётесь. Слава хорошую идею предложил. Ей воспользуйтесь. ..
 
xenon13 до сих пор не понял, что вычисление остатка по модулю исторически всегда было целочисленной операцией. И хочет, чтобы такие же точные результаты были при вещественных аргументах, даже в точке разрыва этой функции...
 
Mathemat:
xenon13 до сих пор не понял, что вычисление остатка по модулю исторически всегда было целочисленной операцией. И хочет, чтобы такие же точные результаты были при вещественных аргументах, даже в точке разрыва этой функции...


"Исторически всегда было целочисленной операцией ..." - оставте свой бред при себе. У Вас 1460 сообщений, а уровень дилетанта.

О каких точка разрывах идет речь ? Вы больны ? Там одна единственная точка разрыва - это при делении на 0.

И вообще, у меня большая к Вам просьба, так как здесь нет функции игнора, никогда не пишите в моих ветках, Ваши тупые замечания отвлекают от сути

KimIV:
xenon13 писал (а):
Может уже пора исправить ошибку, а не философствовать нам о мирах, особенно когда они исключительно в двоичной системе исчисления, а не вещественные !!!
Бросьте, xenon13, на бан нарвётесь. Слава хорошую идею предложил. Ей воспользуйтесь. ..


А я думал на внештатную зп бета-тестера. Черт, а получится как всегда :)

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

Сначала Quik динамил всех с API и внутренним программированием, а сейчас его быстро вытеснит MT, но если и МТ пойдут тем же путем что и QUIK в отношении пожеланий пользователей .... кажется это называется эволюция :)

.

 
xenon13:
"Исторически всегда было целочисленной операцией ..." - оставте свой бред при себе. У Вас 1460 сообщений, а уровень дилетанта.

О каких точка разрывах идет речь ? Вы больны ? Там одна единственная точка разрыва - это при делении на 0.

Да уж, Ваш математический уровень даже ниже моего совсем никудышнего. ..

P.S. А точка разрыва MathMod() - это, например, (5; 0.1). Объяснить, почему? Очень просто: если первый аргумент 4.999999, второй в точности равен 0.1, то результат в идеале должен быть равен 0.099999. Но если взять первый аргумент 5.000001, оставив второй тем же, то результат должен быть 0.000001. Вот пример:

int start()
{
  Print( DoubleToStr( MathMod( 4.999999, 0.1 ), 6 ) ); // возвращает 0.099999
  Print( DoubleToStr( MathMod( 5.000001, 0.1 ), 6 ) ); // возвращает 0.000001
  return( 0 );
}
 
KimIV:
stringo:

... переводите все Ваши вычисления на целочисленную основу.

Благодарю...


А если я не знаю сколько у меня знаков после запятой ? Более того, мне это и нужно узнать.

Нет, я конечно могу число умножить на 10^n, только это, как бы сказать помягче - не изящно.

Да и потом MathMod опять вернет double и опять гадай что там, а потом гадай что выведет Print(), и совпадает ли оно с double, с NormDouble и с тем что вообще должно быть по математике :)

Xотя, в идеале, он воообще обязан выдавать int и ничего более !!!

 
Для целочисленной арифметики есть операция взятия остатка %
 
Подскажите, как простому смертому, не мега програмисту пользоваться функцией  MathMod(), пользоваться етой функцией как правильной математически... Так правильно MathMod(NormalizeDouble(5,0),NormalizeDouble(0.1,1)) ? Напишите плз
 
KimIV >>:

Слава, я согласен с xenon13. Математика есть матиматика. Посмотрите на это с точки зрения именно матиматика и согласитесь, что реализация функции fmod кривоватая.

Из моих проверок:
Print(MathMod(4, 0.5)); возвращает 0
Print(MathMod(4, 0.4)); возвращает 0.4

Мне такой расклад тоже не по душе...

Согласен.

Смотрим описание на MathMod


double MathMod( double value, double value2)
Функция возвращает вещественный остаток от деления двух чисел.

Функция MathMod рассчитывает вещественный остаток f от x / y таким образом, что x = i * y + f , где i является целым числом, f имеет тот же знак, что и x, и абсолютное значение f меньше, чем абсолютное значение y.


и так

для варианта 1 (по формуле в описании)

4=8*0.5+0 - результат верен


для варианта 2 (по формуле в описании)

4=10*0.4+0.4 - результат не верен


И где тут логика или вещественный мир?


Вывод - описание не соответствут действительности или....