в частности OpenOffice (который считает как и Excel) в своей справке приводит такую формулу: Dividend - Divisor * INT(Dividend/Divisor)
но дело в том, что использовать их реализацию INT в этой формуле нельзя, т.к. он округляет в меньшую сторону (-1.3 -> -2). использовать надо TRUNC.
да и если подумать логически, то парсерная реализация правильная, т.к. % (==MOD) возвращает _остаток_от_деления_. и т.к. с абсолютное значение делимого меньше делителя, то всё делимое и должно вернуться в виде результата функции.
Не указано, что сдвиговые операции работают до int
Притом, что, как пишет PAF, «». Уж не знаю насколько сдвиговые операции можно считать числовыми вычислениями, но путаницу явно не описанные ограничения вносят.
Остальные битовые операции тоже ограничены int'ом?
сдвиговые операции работают с int по моему вообще везде (посмотрите доку perl, python -- там они работают аналогично), т.к. особого смысла двигать биты у double -- нет.
в p3 они работают с double, но при этом происходит неявное приведение типа к int, т.е. в случае больших double происходит потеря данных.
то, что писал ПАФ -- почти корректно, т.к. формально сдвиговые операции относятся к _битовым_ операциям, а не к математическим (== числовые вычисления).
возможно я некорректно выразился. я имел в виду, что эти операции работают только с целочислеными типами. теперь внимание вопрос: какие целочисленные типы есть у p3?
я имел в виду, что эти операции работают только с целочислеными типами За неимением большего, чем int целого приходится пользоваться double для операций с целыми числами. Лично для меня неожиданно, что битовые операции ограничены int'ом — в исходниках не копаюсь, а в документации не указано.
Уж как работает, но плохо, что не описано, и приходится выяснять, потратив время на то, чего сделать нельзя в принципе.
предлагаю назначить виновным меня, т.к. я скрыл сию наиважнейшую информацию, не доступную ни в гугле ни в другом поисковике, от общественности.
P.S. в принципе сделать можно, т.к. << без проблем заменяется умножением, а >> -- делением, но ведь это не важно, главное -- что найден виновный.
P.P.S. Лично для меня неожиданно, что битовые операции ограничены int'ом — в исходниках не копаюсь, а в документации не указано.
увы, в документации также не указано, что, например, операции '+', '-' итд ограничены числами, а ^math:sqrt() не умеет извлекать корни из отрицательных чисел. да и много чего ещё.
P.P.P.S. три дня тратить на такую проблему -- не многовато-ли?
предлагаю назначить виновным меня, т.к. я скрыл сию наиважнейшую информацию, не доступную ни в гугле ни в другом поисковике, от общественности.
К чему этот сарказм? Я где-то какие-то претензии высказывал, или что?
Google'ом находится всё, или почти всё. Видимо, нынче это повод не задавать вопросов по языку в «форум поддержки» языка, прискорбно. Что ж, впредь не будут отвлекать контингент от важнейших вопросов правильной генерации XML и коллективных цитирований документации.
P.S. в принципе сделать можно, т.к. << без проблем заменяется умножением, а >> -- делением, но ведь это не важно, главное -- что найден виновный.
[внимательно смотрит]
Я поинтересовался причиной явлений, которых не понимаю. Привёл пример тех же действий в других окружениях, которые дают другой результат. После прояснения предложил явно указать ограничения, пусть для кого-то и очевидные, в документации. Есть мнение, она именно для этого предназначена.
Откуда эти пассажи про нахождение виноватого — мне не ясно. Если это следует из моих слов — убедительная просьба мне процитировать эти слова.
три дня тратить на такую проблему -- не многовато-ли?
Это часть переноса стороннего алгоритма, по большому счёту, «в лоб», чтобы заставить работать, и далее заняться разбором и оптимизацией. Три дня — время, которое ушло на перенос того, что Парсер не сможет посчитать и правильно было бы оставить частичную реализацию на Python или Perl и вызывать по необходимости.
ответ на вопрос был дан менее чем через час после его публикации, разве нет?
наличие документации не гарантирует понимания сути проблемы и поиска решений, именно поэтому поисковики -- верный друг разработчика. например, если бы вы переносили ваш код из Excel в VB (вообще продукты одной малоизвестной компании) вы бы столкнулись с аналогичной проблемой в случае MOD.
описать в документации абсолютно всё -- невозможно. то, что для одного является очевидным -- для другого оно таковым не является. где провести грань "очевидного" -- в общем случае неясно. но для меня очевидным является то, что использующий битовые операции понимает что они делают и с чем они работают (аналогично с тригонометрическими функциями и ещё много с чем). хотя я согласен, что иногда при переносе какого-либо кода приходится сталкиваться с чем-то, с чем ранее сталкиваться не приходилось, и частенько возникают проблемы.
про "пассажи про виноватого": виноват (почему-то воспринял предложение про экономию 3 дней как претензию). был не прав. вспылил.
ответ на вопрос был дан менее чем через час после его публикации, разве нет?
Так точно. За что я поблагодарил.
если бы вы переносили
Давно ли мы стали на «вы»?
Может и столкнулся бы, но в настоящий момент столкнулся с Парсером, и задал вопрос там, где на него можно получить компетентный ответ. Ну, в надежде разъяснить вопрос локально, не выискивая какими типами ограничены другие языки и какими формулами вычисления руководствуются.
то, что для одного является очевидным -- для другого оно таковым не является. где провести грань "очевидного" -- в общем случае неясно
Да дело-то хозяйское. Указано, что — сложнейшая для понимания вещь.
Следующему идиоту, по какой-либо причине не повторяющему каждый день, на протяжении 10 лет, курс алгебры и двоичной арифметики, даже такое обсуждение сможет помочь.
Что до задачи — работать заставлю, время на неё не зря потрачено. Более того, ошибка наверняка обходима, реализации вычисления есть на разных языках, в том числе JavaScript. Легко может статься, что работа с подобными числами — допущенная мной ошибка, но расхождения мешали локализовать эту возможную ошибку сравнением результатов фрагментов кода. Сейчас сделал самым простым способом — вызовом работающего решения.