Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

21 Ноябрь 2017, 16:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 »   Вниз
  Печать  
Автор Тема: целочисленное деление работает неправильно  (Прочитано 842 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ForumOOo (бот)
Ветеран
*****
Offline Offline

Сообщений: 607


« Стартовое сообщение: 17 Октябрь 2017, 08:25 »

Компонент: 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
Капитана в тот день называли на "ты"
Гуру
*******
Online Online

Пол: Мужской
Расположение: Киев
Сообщений: 2 359


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #1: 17 Октябрь 2017, 08:31 »

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

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Netlog
Новичок
*
Offline Offline

Сообщений: 10


« Ответ #2: 17 Октябрь 2017, 08:48 »

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

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 662


« Ответ #3: 17 Октябрь 2017, 09:18 »

Тут, конечно, нужно разбираться. В принципе, значение 508775380324475 помещается в 52 бита мантиссы (на самом деле занимает всего 48 бит), так что представимо в double. Пожалуйста, заведите сообщение об ошибке в багтрекере.
« Последнее редактирование: 17 Октябрь 2017, 09:41 от mikekaganski » Записан

С уважением,
Михаил Каганский
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Online Online

Пол: Мужской
Расположение: Киев
Сообщений: 2 359


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #4: 17 Октябрь 2017, 11:03 »

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

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
mikekaganski
Ветеран
*****
Online Online

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 662


« Ответ #5: 17 Октябрь 2017, 11:06 »

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

С уважением,
Михаил Каганский
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Online Online

Пол: Мужской
Расположение: Киев
Сообщений: 2 359


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #6: 17 Октябрь 2017, 11:14 »

Ну, мой Эксель сдался гораздо раньше и на дольше... Слабак!


* ДвоичноеПредставлениеБольшогоЧисла.png (14.6 Кб, 267x335 - просмотрено 5 раз.)
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
mikekaganski
Ветеран
*****
Online Online

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 662


« Ответ #7: 17 Октябрь 2017, 11:36 »

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

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

С уважением,
Михаил Каганский
mikekaganski
Ветеран
*****
Online Online

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 662


« Ответ #8: 17 Октябрь 2017, 11:43 »

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

С уважением,
Михаил Каганский
mikekaganski
Ветеран
*****
Online Online

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 662


« Ответ #9: 17 Октябрь 2017, 12:18 »

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

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

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

С уважением,
Михаил Каганский
kompilainenn
Ветеран
*****
Offline Offline

Сообщений: 2 109



« Ответ #10: 17 Октябрь 2017, 12:22 »

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

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

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

Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Online Online

Пол: Мужской
Расположение: Киев
Сообщений: 2 359


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #11: 17 Октябрь 2017, 12:36 »

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

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

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
kompilainenn
Ветеран
*****
Offline Offline

Сообщений: 2 109



« Ответ #12: 17 Октябрь 2017, 13:52 »

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

Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут
mikekaganski
Ветеран
*****
Online Online

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 662


« Ответ #13: 17 Октябрь 2017, 14:09 »

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

=INT(A2/2^32)
=A2-INT(A2/2^32)*2^32
Записан

С уважением,
Михаил Каганский
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Online Online

Пол: Мужской
Расположение: Киев
Сообщений: 2 359


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #14: 17 Октябрь 2017, 14:38 »

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

Кстати, Netlog! Спасибо за интересный вопрос (а то что-то скучно было в последнее время) и за найденную ошибку  Всё хорошо
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Страниц: 1 2 »   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!