НЕ РАБОТАЕТ MathMod !!!

 

Print (MathMod(5, 0.1));

Выдает 0.1

Что за бред ?

 

Не бред, а внутреннее представление вещественных чисел.

На входе второй параметр представлен как 0.10000000000000001

На выходе функции результат - 0.099999999999999728

 
stringo:

Не бред, а внутреннее представление вещественных чисел.

На входе второй параметр представлен как 0.10000000000000001

На выходе функции результат - 0.099999999999999728


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

Функция выдает в корне не верный результат, что тут вообще еще можно обсуждать ?

 

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

 

Зачем чего-то подгонять? MathMod просто-напросто вызывает функцию fmod из crt.

Вы вообще какого результата ожидали? чистого 0 или числа в диапазоне от 0 до 0.1?

 
Mathemat:

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


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

stringo:

Зачем чего-то подгонять? MathMod просто-напросто вызывает функцию fmod из crt.

Вы вообще какого результата ожидали? чистого 0 или числа в диапазоне от 0 до 0.1?


Хм, давайте обсудим математику 1 класса: 5/0.1 = 50

Откуда берется остаток 0.1 !!! ладно хотя бы 0.0000000000000000000000000000000001 или что-то подобное, но ошибка в первом знаке после запятой ????

 
Я ещё раз повторяю, что на входе параметр не 0.1 ровно, а 0.10000000000000001. Это я в отладчике посмотрел. Добро пожаловать в мир вещественных чисел!
 
stringo:
Я ещё раз повторяю, что на входе параметр не 0.1 ровно, а 0.10000000000000001. Это я в отладчике посмотрел. Добро пожаловать в мир вещественных чисел!


Я тоже посмотрел в VS C++:

double a = 5;

double b = 0.1;

double c = fmod(a,b);

Итого:

a = 5.000...1

b = 0.10000....1

c = 0.099999999...728

Ну если уж Вы напрямую взяли fmod из crt, на кой округлять результат в MQL4 до 0.1 ? Оно как раз и сбивает с толку.

Как я отличу теперь 0.1 от 0.09999.....728 ????

 
xenon13 писал (а): Вы как всегда ни к месту и ни ко времени, посмотрите прототип функции.

xenon13, я видел прототип.

Еще раз повторяю, если Вы не поняли: функция MathMod() терпит разрыв (неустранимый) в точках, в которых первый аргумент кратен второму. 5 кратно 0.1, а уж насколько точно - это уже зависит от того, что сказал stringo.

P.S. Я прекрасно знаю, для чего существует функция взятия по модулю в теории целых чисел. Зачем в crt реализована та же функция с вещественными аргументами - не понимаю.

 
xenon13:
stringo:

Не бред, а внутреннее представление вещественных чисел.

На входе второй параметр представлен как 0.10000000000000001

На выходе функции результат - 0.099999999999999728


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

Функция выдает в корне не верный результат, что тут вообще еще можно обсуждать ?

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

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

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

 

Мы ничего никуда не округляем (до 0.1 или до 0.4). Почитайте документацию. Это Print выводит вещественные числа с точностью до 4-го знака. Хотите увидеть (именно увидеть) точность до 8-го знака используйте функцию DoubleToStr. Или DoubleToStrMorePrecision из наших примеров