целочисленное деление работает неправильно

Автор ForumOOo (бот), 17 октября 2017, 08:25

0 Пользователи и 1 гость просматривают эту тему.

ForumOOo (бот)

Компонент: Calc
Версия продукта: 5.x
Сборка: LibreOffice
ОС: Win XP 32 битп, sp3

Libre office 5.3.6.1
5.4 отказался ставиться на XP
скачал 5.3
В Calc все функции на русском! Как бы их вернут ьк английскому варианту?
И тут же попалась непонятная вещь
целочисленное деление работает неправильно
=ОСТАТ(508775380324475;2) даёт   #ЗНАЧ!
=ЧАСТНОЕ(508775380324475;2) даёт 254387690162238, на единицу больше
правильного ответа
При этом бОльшие числа делятся верно, и меньшие тоже.
Рядом с 508775380324475 нечётные числа ведут себя так же, неправильно.




--
Подпись: Netlog

JohnSUN

Добро пожаловать на форум, Netlog!
С языком функций - это просто
А с большими числами - это суперкруто! Случайно наткнулся или специально искал? И что, действительно нужно что-то простое арифметическое делать с такими громадными значениями?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Netlog

случайно нашёл, школьная задачка по информатике, 39^10 перевести в двоичный вид и посчитать в нём единицы.

mikekaganski

#3
Тут, конечно, нужно разбираться. В принципе, значение 508775380324475 помещается в 52 бита мантиссы (на самом деле занимает всего 48 бит), так что представимо в double. Пожалуйста, заведите сообщение об ошибке в багтрекере.
С уважением,
Михаил Каганский

JohnSUN

Забавное число...
Даже для обходного варианта
=508775380324475-INT(508775380324475/2)*2 возвращает хоть и не ошибку, но совершенно нелепую "минус единицу". Это откуда же оно взялось? =INT(39^10/2)/2/2/2=INT(39^10/2)/8?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

mikekaganski

там, конечно, многое можно представить себе. Мы пытаемся производить целочисленные вычисления на числах с плавающей точкой. Не знаю, что там может получаться. Забавно, что даже при НЕцелочисленном (обыкновенном) делении на 2 получается ЦЕЛОЕ число. Причём и в Экселе тоже, и там тоже проблемы с MOD... :)
С уважением,
Михаил Каганский

JohnSUN

Ну, мой Эксель сдался гораздо раньше и на дольше... Слабак!
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

mikekaganski

Цитата: JohnSUN от 17 октября 2017, 11:03
Даже для обходного варианта
=508775380324475-INT(508775380324475/2)*2 возвращает хоть и не ошибку, но совершенно нелепую "минус единицу". Это откуда же оно взялось? =INT(39^10/2)/2/2/2=INT(39^10/2)/8?

Здесь почему-то при (508775380324475/2) получается деление с округлением, а значит, 0,5 округляется в бОльшую сторону... со всеми вытекающими
С уважением,
Михаил Каганский

mikekaganski

Если использовать 39^10+X, где X от 1 до ..., в ЛО тоже всякие странности вылезают в виде ошибок на других этапах (в строках 2-13 в разных комбинациях...)
С уважением,
Михаил Каганский

mikekaganski

Ох... мы тут и ворочаем со значениями.

https://opengrok.libreoffice.org/xref/core/sal/rtl/math.cxx#1137

Функция rtl_math_approxValue
Мы сначала вычленяем знак, экспоненту, домножаем число на 10^экспонента, проверяем, округляем, делим назад, опять проверяем... Мне кажется, здесь стоило бы проверять на близость к максимально представимому в double целому числу перед всем этим безобразием (скажем, если число боьше 2^41).
С уважением,
Михаил Каганский

kompilainenn

Цитата: mikekaganski от 17 октября 2017, 10:18Ох... мы тут и ворочаем со значениями.

https://opengrok.libreoffice.org/xref/core/sal/rtl/math.cxx#1137

Функция rtl_math_approxValue
Мы сначала вычленяем знак, экспоненту, домножаем число на 10^экспонента, проверяем, округляем, делим назад, опять проверяем... Мне кажется, здесь стоило бы проверять на близость к максимально представимому в double целому числу перед всем этим безобразием (скажем, если число боьше 2^41).
Mike, ИМХО, багу надо заводить тебе и подключать туда Айка и иных квадратноголовых товарищей.
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

JohnSUN

Категорически не согласен! Они не квадратноголовые! Это кубы, а не квадраты... что вызывает зависть и уважение.

Может, как вариант решения, на больших числах переходить на символьную математику (или как она там правильно называется)? Ну, когда число обрабатывается как строка отдельных десятичных (двоичных, восьмеричных, etc) цифр по обычным правилам "арифметики на бумажке"?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

kompilainenn

тут тема такая, а ТС-то остался без ответа, что ему делать? Использовать python для его вычислений, он вроде бы более под такие задачи подходит, или нет?
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

mikekaganski

Разбить на две части (скажем, по границе 2^32), и делать по частям

=INT(A2/2^32)
=A2-INT(A2/2^32)*2^32
С уважением,
Михаил Каганский

JohnSUN

Цитата: kompilainenn от 17 октября 2017, 13:52
тут тема такая, а ТС-то остался без ответа, что ему делать? Использовать python для его вычислений, он вроде бы более под такие задачи подходит, или нет?
Ой, да ладно! Netlog задачу давно решил на бумажке... Иначе откуда бы он знал об ошибке в вычислениях.
Можно, конечно, и python. Но хотелось же без кода, на одних формулах сделать...

Кстати, Netlog! Спасибо за интересный вопрос (а то что-то скучно было в последнее время) и за найденную ошибку  :beer:
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне