|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
Выражение меняет значение при изменении последовательности его вычисления. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 12:45 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
И шо ? Правила округления в школе не проходил 14,934(9) = 14.94 все правильно ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 12:57 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevИ шо ? Правила округления в школе не проходил 14,934(9) = 14.94 все правильно То что в школе учили, что b и с должны быть равны! ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 13:05 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
ProteusТо что в школе учили, что b и с должны быть равны!А в институте ты машинную арифметику ограниченной точности не проходил? Не воинствуй, а включи мозг. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 13:16 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
ProteusВыражение меняет значение при изменении последовательности его вычисления.Для демонстрации очевидного незачем так многобуквенно излагать код. Достаточно Код: plsql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 13:22 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
Насамом деле, сначала написал не очень вежливый ответ автору, потом "включил мозг" и понял, что я тоже не знаю, как Oracle считает и как его заставить считать правильно. По правильно, я понимаю считать не в float/double, а с фиксированной точкой. Тупо поменял тип переменных в примере автора на number( 15, 5 ) и понял, что "тупо" не прокатило, а как правильно, я не знаю ((( ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 13:29 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
А где в доке описывается порядок определения типов (точности) при вычислениях в PL/SQL ? сходу в И-нете не нашел ((( Код: sql 1. 2. 3. 4. 5.
В чем считать будет? В number(15,4) или в float ? Как правильно указать, что считать в number(15,4) ? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 13:37 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevПо правильно, я понимаю считать не в float/double, а с фиксированной точкой.Если в выражении нет аргументов binary_float/_double, оно считается с фиксированной точкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 13:38 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
-2-Leonid KudryavtsevПо правильно, я понимаю считать не в float/double, а с фиксированной точкой.Если в выражении нет аргументов binary_float/_double, оно считается с фиксированной точкой. "Все не так очевидно" ( C ) С какой фиксированной точкой? Откуда Oracle узнает требуемую точность констант. И, самое главное, как ее указать. Подозреваю, что константа 0.0725 как раз и есть binary_float. Нужно ли и как ее привести к fixed виду? p.s. возможно несу бред, просьба меня простить. Просто ткнулся вроде в очевидную вещь и понял, что не понимаю ((( ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 13:43 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevПодозреваю, что константа 0.0725 как раз и есть binary_float.Если не указан суффикс, то константа имеет тип number. В sql операнды смешанных числовых выражений приводятся к типу по приоритету binary_double, binary_float, number. Вычисление выражения производится с внутренней точностью binary_double или number(40). В plsql целые числа в пределах 32х разрядов обрабатываются как pls_integer. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 14:06 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsevа как правильно, я не знаю ((( Elic уже дал вполне достаточную подсказку. Собственно, программистов обычно этому учат в явном виде. Классическая тестовая задача - как подсчитать сумму некоего массива с наименьшей потерей точности. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 14:38 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
ProteusLeonid KudryavtsevИ шо ? Правила округления в школе не проходил 14,934(9) = 14.94 все правильно То что в школе учили, что b и с должны быть равны! А тебя не удивляет, что a и с равны? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 14:39 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
все сводится к двум строкам Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
в первом случае результат 30900 * 0.0725* 2 делится на 3 без остатка во втором случае результат 0.0725* 2 НЕ делится на 3 без остатка ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 14:59 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
а тут все идентично Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 15:01 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
Всегда знал, что округление это занятно. Еще и интерфейс приложений может радости добавить. Копи-паст результат одного запроса в другой - и получи неверный ответ. Код: sql 1. 2. 3. 4. 5.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options Видишь девятки? А они тут есть ------------------------------ 14,935 ROUND(14.935,2) --------------- 14,94 ROUND(0.0725*2/300*30900,2) --------------------------- 14,93 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 15:26 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
andrey_anonymous Меня растроило, что я почему-то наивно думал, что SQL ( PL/SLQ ) типизированный язык. И если явно указана точность, то с такой точностью он и должен считать. А, как верно ответил elic, он считает с максимальной точностью или вообще в binary_double, что IMHO как-то для типизированного языка не совсем правильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 15:30 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevВсегда знал, что округление это занятно.Возьми паузу и сразу диссертацию напиши про деление на 3, округление округления, сумму округлений и округление суммы,... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 15:31 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevА, как верно ответил elic, он считает с максимальной точностью или вообще в binary_double, что IMHO как-то для типизированного языка не совсем правильно. 1. Elic отметил совсем не это. 2. Ну и какая точность у number()? 3. Приведите пожалуйста Ваше понимание " такой точностью он и должен считать" на примере этого топика. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 15:33 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevИ если явно указана точность, то с такой точностью он и должен считать. Может ли INT-параметр иметь дробную часть? - Увы... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 15:36 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
Ответ тех.поддержки Incorrect Results Returned by ROUND Function (Doc ID 1936942.1) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 16:09 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
andrey_anonymous... Классическая тестовая задача - как подсчитать сумму некоего массива с наименьшей потерей точности. andrey_anonymous, Это интересно. на эту тему мне известно четыре захода: сортировать asc и складывать, сложение по Кахану, сложение по Ноемайеру, то, что можно было бы назвать "сложением по Кислицину" - складывать на двоичном счетчике-абаке. Какой из них вы используете хоть в каких-нибудь вычислениях, не используете никакой, или используете некий пятый метод? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 17:03 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
booby, Деление. -2- уже намекнул: "напиши про деление на 3". Вот и скажи какой из "четыре захода" определит какая точность результата деления 1 на 3. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 17:57 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
SY, Извини, это выглядит как подмена понятий. вычитание для демонстрации катастрофической потери точности ничем не хуже деления - понятнее и проще. Думаю, что про деление на 3 -2-, вероятнее всего, говорил в контексте точности представления числа 1/3 в первую очередь. Поясню - меня сейчас не интересует минимизация потери точности при произвольном вычислении. я задал более простой вопрос - касающийся "классической тестовой задачи", пытающейся минимизировать её потерю при простом сложении, существенно более стабильным в отношении скорости нарастания ошибки по отношению и к вычитанию и к делению. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 18:12 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
SY"напиши про деление на 3" не очень понятно, в чем проблема деления на 3, это всего лишь сдвиг на один разряд вправо в троичной системе счисления ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 18:21 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsevне очень понятно, в чем проблема деления на 3, это всего лишь сдвиг на один разряд вправо в троичной системе счисленияТебе доставляет удовольствие прикидываться тупым или ты действительно? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2019, 23:16 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
booby, ладно, хоть andrey_anonymous и не захотел "делиться своими секретами", из топика надо как-то разумно выходить, раз уж влез в него. Решил накидать модель того, что в предыдущем посте было названо "сложением по Кислицкому", поскольку вряд ли что-то вообще гуглится по такому названию, и вряд ли каждый из прочитавших немедленно понял, о чем идет речь. идея "отсортировать и сложить" состоит в первую очередь в сложении сначала малых значений, образуя из них такую текущую сумму, которая, по вероятности, не потеряется при сложении со следующими б о льшими значениями в складываемом потоке. Но это по настоящему хорошо работает лишь на некоторых потоках данных, не говоря о затратах на сортировку. Альтернативную идею можно сформулировать так: 1) образуй частичные суммы 2) складывай между собой такие частичные суммы, которые испытали до этого одно и то же количество сложений. Из такой формулировки выводится две несхожие реализации, одна из которых в статье англоязычной википедии о сложении по Кахану названа попарным сложением, а другая не упоминается. Общего между ними то, что в обоих случаях образуется двоичное дерево вычислений одной и той же высоты. Общее число сложенных элементов определяется как 2 в степени высоты дерева. Высота 64 достаточна для сложения 2**64 слагаемых, что выглядит как с большим запасом достаточное количество для использования в обычных базах данных (18 446 744 073 709 551 616 слагаемых). 64 - это оценка максимальной глубины рекурсии попарного сложения, построенного на рекурсивном методе "разделяй и властвуй", и это же оценка необходимого количества "ячеек" дополнительной памяти, в которые складываются частичные суммы во втором методе. То есть использование дополнительного массива в 64 элемента обеспечивает достаточно места для сложения результатов, определяемых частичными суммами, испытавшими одно и то же число сложений. этот массив можно назвать "счетчиком сложений", хранящим результаты самих частичных сложений - т.е. простейшими счетами - абаком, в ячейки которого складываются частичные суммы. В отличие от метода "попарных сумм" такой заход обеспечивает отсутствие рекурсии, высокую степень локальности хранимых данных, легко приспосабливается к работе в параллельном окружении, и годен для работы с потоковыми данными. При одной и той же асимптотической производительности и одинаковых статистических характеристиках нарастания ошибки, он должен несколько быстрее работать именно на массивах, а на потоках попарное сложение ему не конкурент. Сейчас набросал вариант реализации для binary_double чисел, для которых алгоритмы подомного сорта и предназначены. Определим на схеме коллекцию числе binary_double: Код: plsql 1.
Работу счетчика сложим в объект: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96.
Параметр p_carry процедуры put в норме возвращает ноль. Как только он вернул не ноль, это значит, что разрядной сетки счетчика не хватило для поддержки высоты вычисления, и с полученным числом вызывающий клиент дальше должен обходиться самостоятельно - разрядная сетка счетчика переполнилась. Вокруг этого, например, легко далее написать оператор специального сложения с помощью дополнительного объекта, и такой счетчик сможет поддержать в этом операторе параллельность работы естественным образом. Этот вариант настолько же лучше попарного сложения, насколько менее известен и совсем не описан в публичных википедиях. PS1 Почему использовал название "сложение по Кислицину" На ютубе как-то набрел на ролики, обсуждающие алгоритм Кислицина поиска наименьшего и следующего за ним наименьшего, упоминаемый в 17 томе УМН 1962г. (Успехи математических наук) в заметках о заседаниях Ленинградского математического общества. (сам алгоритм в УМН не приводится, но дается асимптотическая оценка его сложности). Двоичный счетчик существенно используется в том алгоритме, но в более сложном конструктивном исполнении. Мимоходом при обсуждении в ролике на ютубе сказано, что с такими счетчиками можно делать много полезных вещей, простейшей из которых является сложение чисел с плавающей точкой с хорошими статистическими характеристиками и по скорости нарастания ошибки и по общей производительности. Т.е., в своей идее, это уже очень старый алгоритм. Возможно уже "ненужный" или даже "бесполезный" в контексте обнаружения метода Ноймайера. За сим из топика выхожу. PS2 надеюсь, топикстартер не сильно обижен за такое замусоривание его топика. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2019, 17:15 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
boobyи вряд ли каждый из прочитавших немедленно понял, о чем идет речь.Прямо тут нужно было остановиться - ибо оно именно так. Вы тут на пару выдумали никому не нужную задачу и извели на неё слишком много букв. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2019, 17:58 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
думаю, настоящая задача возникнет, когда заказчик скажет, что ему пофиг все тонкости машинного округления и троичных систем, и что значение выражения round(0.0725* 2 / 300 * 30900, 2) должно равняться 14,94 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2019, 20:20 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
andreymxдумаю, настоящая задача возникнет, когда заказчик скажет, что ему пофиг все тонкости машинного округления и троичных систем,Ага, разные военные чмо пытались продавить, что в военное время пи равно, скажем, трём. Если заказчик дурак, то это не лечится. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.08.2019, 20:55 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
Elic, может быть не заметил, но вообще единственным сообщением по теме, в топике был пост от Тролин. После него в этом топике остается только плясать и веселиться, а ты на людей бросаешься... На месте Oracle и я бы заявил, что это not a bug - кто же будет менять математику, работавшую столько десятков лет, да и созданную задолго до формирования подходящих к случаю стандартов. Воспроизводимость повторного вычисления важнее. Конечно, совет про round(,20) от них читается с неизбывным впечатлением о том, что ты опять попал на sql.ru Но содержательно выбор не так велик - либо кастовать число к raw и копать там про необходимость округления граничной цифры, раз уж это не сделали разработчики библиотечной математики, либо просто обзавестись подходящим к случаю двухфазным округлением. для себя когда-то я сваял, как раз по аналогичному случаю, такую функцию: Код: plsql 1. 2. 3. 4.
я ее не рекламирую, не афиширую и не обсуждаю с кем бы то ни было. Просто использую в таких местах, за которые меня те, кто знает о существовании числа пи, не смогут укусить. 3, кстати, очень хорошее приближение пи для многих практических случаев, не только в военное время. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2019, 15:06 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
boobyдля себя когда-то я сваял, как раз по аналогичному случаю, такую функцию: Код: plsql 1. 2. 3. 4.
А если в периоде не 9 а 6? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2019, 15:39 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
iOracleDev, вы не прочитали - мною функция не обсуждается. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2019, 15:44 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsevне очень понятно, в чем проблема деления на 3, это всего лишь сдвиг на один разряд вправо в троичной системе счисления 1/2 в троичной системе? 1/3 и 1/2 в одном выражении? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2019, 15:48 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
Добрый день всем. А почему получается такой результат? Код: plsql 1. 2. 3.
Код: plsql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 09:54 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
grinnА почему получается такой результат?Правила округления, 5й класс средней школы. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 10:19 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
-2-, Похоже, прогулял тот урок. Был уверен, что округлять начинаем с самого младшего разряда. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 10:46 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
andreymxдумаю, настоящая задача возникнет, когда заказчик скажет, что ему пофиг все тонкости машинного округления и троичных систем, и что значение выражения round(0.0725* 2 / 300 * 30900, 2) должно равняться 14,94 В корень зришь, именно это и произошло. Пришлось изменить формулу расчета для того что бы она соответствовала формуле проверки. ( я конечно не понял их идеи о проверке расчета той же формулой но ничего не докажешь ) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 12:19 |
|
Перемена место множителя в выражении имеет значение
|
|||
---|---|---|---|
#18+
Proteus... ( я конечно не понял их идеи о проверке расчета той же формулой но ничего не докажешь ) ты же в первом посте написал: Выражение меняет значение при изменении последовательности его вычисления написанное пером не вырубается топором. У тебя нет свободы выбора. У клиента тоже нет. вопрос лишь в том, чья несвобода напористей. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2019, 12:32 |
|
|
start [/forum/topic.php?all=1&fid=52&tid=1882224]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 156ms |
0 / 0 |