|
|
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
не могу найти на форуме. но проблема старая и я был уверен что давно решенная Oracle 11.2.0.3.0 64 bit ситуация следующая. есть средних размеров таблица. начиная с определенного момента запрос вида Код: sql 1. стал выдавать следующие данные: Код: plaintext 1. 2. 3. с чем связан этот баг в целом понятно - особенности хранения вещественных чисел. вопрос в другом, как с этим бороться? получается что ни в одном запросе нельзя использовать суммирование без округления? результат не гарантирован. или архитектурно прописывать всегда точность хранения.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 10:02 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
bigkerс чем связан этот баг в целом понятноЗаблуждаешься. RTFM set numwidth, DUMP, TO_CHAR ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 10:09 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
bigker, Странно, у меня вот так например: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 10:46 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
MaximaXXLСтранно, у меня вот так например:А надо так: Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 10:55 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
Как раз на тему "всегда ли определять Number?" http://www.sql.ru/forum/1264000-1/vsegda-li-opredelyat-number ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 11:09 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
Ну вобщем я понимаю так - то что я не вижу знака в 37 разряде после запятой - не значит что его там нет. и нужно было озаботиться округлением (trunc) самому. либо при записи данных, либо при суммировании. Все вокруг сплошной обман =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 11:49 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
bigkerНу вобщем я понимаю так - то что я не вижу знака в 37 разряде после запятой - не значит что его там нет. и нужно было озаботиться округлением Озаботиться нужно заданием необходимых масштаба и точности для поля с типом данных NUMBER, а не вбиванием костылей в виде округления и усечение имеющихся данных. И, да (поскольку структура таблицы не показана) - избегать применения машинных числовых типов (binary_float & binary_double) если требуется фиксированная точность вычислений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 12:00 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
bigkerНу вобщем я понимаю так - то что я не вижу знака в 37 разряде после запятой - не значит что его там нет.Да. bigkerокруглением (trunc)Ты уж определись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 12:01 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
молчать и слушать, молчать и слуизбегать применения машинных числовых типов (binary_float & binary_double)Ни один из этих типов не может дать наблюдаемой здесь точности (погрешности) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 12:03 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
Elicмолчать и слушать, молчать и слуизбегать применения машинных числовых типов (binary_float & binary_double)Ни один из этих типов не может дать наблюдаемой здесь точности (погрешности) Даже binary_double легко дает гораздо большую погрешность: Код: plsql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 12:52 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousгораздо большую погрешностьпредлагаю задуматься над словом "наблюдаемой", сравнить порядок погрешности и исходной величины. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 14:17 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
-2-andrey_anonymousгораздо большую погрешностьпредлагаю задуматься над словом "наблюдаемой", сравнить порядок погрешности и исходной величины. Раскройте пожалуйста свою мысль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 14:21 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousРаскройте пожалуйста свою мысль.Сперва ты: ты мне возражал или же подтверждал мой тезис своим примером? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 14:26 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous-2-пропущено... предлагаю задуматься над словом "наблюдаемой", сравнить порядок погрешности и исходной величины. Раскройте пожалуйста свою мысль.Между 10 1 и 10 -38 требуется точность 40 значащих цифр. binary_double дает до 18 десятичных знаков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 14:27 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
-2-andrey_anonymousпропущено... Раскройте пожалуйста свою мысль.Между 10 1 и 10 -38 требуется точность 40 значащих цифр. binary_double дает до 18 десятичных знаков. И что из этого следует? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 14:34 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
bigkerне могу найти на форуме. но проблема старая и я был уверен что давно решенная Oracle 11.2.0.3.0 64 bit пропущено... с чем связан этот баг в целом понятно - особенности хранения вещественных чисел. вопрос в другом, как с этим бороться? получается что ни в одном запросе нельзя использовать суммирование без округления? результат не гарантирован. или архитектурно прописывать всегда точность хранения.... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. По логике, после вычисления надо округлять. Могут не сойтись условия a-b=0, либо минус между множествами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 14:50 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
kernAМогут не сойтись условия a-b=0. * имелось ввиду значения из одной колонки, сгруппированные по определённому признаку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 14:53 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous-2-пропущено... Между 10 1 и 10 -38 требуется точность 40 значащих цифр. binary_double дает до 18 десятичных знаков. И что из этого следует? следует то, что некорректно сравнивать граничные number и binary_float, в первый влазит намного больше "информации" - значащих цифр, разница между ними будет всегда проблема же автора скорее из отряда того, что у него клиенские double/float (а это очень распостраненная практика - преобразовывать number, который base100 разновидность BCD в типы IEEE на клиенте, ибо там других типов нет) пишутся в базу данных без специальной коррекции, в результате он наступает на проблему http://0.30000000000000004.com/ и тут ему только в trunc()/round(), ну и в dump() для полного просвещения, сама же СУБД тут абсолютно ни при чем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 15:01 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
dbpatchandrey_anonymousпропущено... И что из этого следует? следует то, что некорректно сравнивать граничные number и binary_float :) Фикус немного в другом. number в oracle имеет не только десятичную мантиссу, но и, что более важно, десятичный порядок. Числа, представленные в IEEE-754, имеют двоичный порядок. И тут наступает смешная штука - множества представимых чисел в этих представлениях тупо не совпадают . И чем больше порядок - тем больше расстояние между представимыми числами, и, следовательно, больше абсолютная погрешность. В итоге, сохраняя IEEE-754 (а они бывают 32, 64, и 80 бит) во вроде бы более точный number, получаем по факту потерю точности, поскольку в number не всегда возможно представить значение double. Потому и ввели в 12с binary_double и binary_float, чтобы классические приложения могли хранить данные без преобразования и не "наступать". И в этой связи мне показался слегка странным данный тут совет избегать этих типов. Если что - устриц ел, в смысле - приходилось как-то плотно заниматься "самопальным" преобразованиями из IEEE-754 в number и обратно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 16:22 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousdbpatchпропущено... следует то, что некорректно сравнивать граничные number и binary_float :) Фикус немного в другом. number в oracle имеет не только десятичную мантиссу, но и, что более важно, десятичный порядок. Числа, представленные в IEEE-754, имеют двоичный порядок. не совсем десятичный, там base100. но с натяжкой ок, можно считать десятичным :) http://www.orafaq.com/wiki/Number#Internal_storage andrey_anonymousИ тут наступает смешная штука - множества представимых чисел в этих представлениях тупо не совпадают . И чем больше порядок - тем больше расстояние между представимыми числами, и, следовательно, больше абсолютная погрешность. В итоге, сохраняя IEEE-754 (а они бывают 32, 64, и 80 бит) во вроде бы более точный number, получаем по факту потерю точности, поскольку в number не всегда возможно представить значение double. а не наоборот ??? andrey_anonymousПотому и ввели в 12с binary_double и binary_float, чтобы классические приложения могли хранить данные без преобразования и не "наступать". сомнительно, ИМХО это было скорее для вопроса перфоманса. andrey_anonymousИ в этой связи мне показался слегка странным данный тут совет избегать этих типов.\ Oracle в подавляющем большинстве случаев используется для подсчета и хранения денег, а использование там нативного double вообще говоря преступление с т.з. бухгалтерий всяких (если у тебя нет библиотеки для "нормализации" копеек после умножений и делений). в IBM вообще есть целая библиотека для "правильного" подсчета денег https://github.com/libdfp/libdfp даром что ей никто не пользуется (в Java и .NET тоже есть имплементации, тоже непопулярные). andrey_anonymous Если что - устриц ел, в смысле - приходилось как-то плотно заниматься "самопальным" преобразованиями из IEEE-754 в number и обратно. да нет там никаких устриц, задача для начального уровня. я с ней столкнулся практически на второй неделе после того, как вообще начал работать программистом - мне принесли два отчета где цифры Итого не сходились. странно, что неофиты до сих пор наступают на такие грабли, и никто не решил проблему системно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 16:39 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
dbpatchне совсем десятичный, там base100. но с натяжкой ок, можно считать десятичным :) Сам когда-то так полагал (и вроде даже писал на этом форуме). Но там чистый BCD. Если конвертировать по-байтно - то да, удобно в сторичной считать. Однако в контексте беседы это вообще не имеет значения. dbpatchandrey_anonymousИ тут наступает смешная штука - множества представимых чисел в этих представлениях тупо не совпадают . И чем больше порядок - тем больше расстояние между представимыми числами, и, следовательно, больше абсолютная погрешность. В итоге, сохраняя IEEE-754 (а они бывают 32, 64, и 80 бит) во вроде бы более точный number, получаем по факту потерю точности, поскольку в number не всегда возможно представить значение double. а не наоборот ??? Что конкретно наоборот? Расстояние между представимыми числами, точность или невозможность представить IEEE-754 в number? dbpatchandrey_anonymousПотому и ввели в 12с binary_double и binary_float, чтобы классические приложения могли хранить данные без преобразования и не "наступать". сомнительно, ИМХО это было скорее для вопроса перфоманса. Что-то я сомневаюсь относительно заметного "перформанс гаин" :) dbpatchстранно, что неофиты до сих пор наступают на такие грабли, и никто не решил проблему системно Так нет тут "системной проблемы", потому и не решают. Всего лишь особенности машинных вычислений, которые по идее должны преподаваться на профильных курсах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 17:06 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
Вот более "чистая" иллюстрация несовпадения представимых множеств IEEE-754 и number: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Как видно и примера, само по себе десятичное 1.000000000000001 представимо в number, но не представимо в double, хотя и делает вид, что представимо :) Ближайшее к 1.000000000000001 представимое в double - это '3FF0000000000005', однако это НЕ 1.000000000000001 и при конвертации double->number получаем ближайшее представимое в number - 1.0000000000000011 Одновременно иллюстрация про точность. Как видим, суммирование в number дает корректный результат. Однако суммирование в double идет с потерей точности, поскольку мантиссы в 6.5 байт для представления суммы не хватает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 18:07 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousdbpatchне совсем десятичный, там base100. но с натяжкой ок, можно считать десятичным :) Сам когда-то так полагал (и вроде даже писал на этом форуме). Но там чистый BCD. ой да ладно. base100 это и разновидность BCD, но если мы говорим про IBM варианты, то .... блин, да нет понятия чистый BCD https://en.wikipedia.org/wiki/Binary-coded_decimal andrey_anonymousdbpatchа не наоборот ??? Что конкретно наоборот? Расстояние между представимыми числами, точность или невозможность представить IEEE-754 в number? всякий IEEE-754 можно представить как number, но не наоборот. ты говорил что как раз не всякий IEEE-754 можно в number, что не есть научно andrey_anonymousdbpatchстранно, что неофиты до сих пор наступают на такие грабли, и никто не решил проблему системно Так нет тут "системной проблемы", потому и не решают. Всего лишь особенности машинных вычислений, которые по идее должны преподаваться на профильных курсах. это не техническая системная проблема, а проблема организационная. практически все актуальные языки программирования имеют реализацию Money/Currency или подобного, от Fixed pointer до BCD вариаций, но этим никто не пользуются, все почему-то считают деньги через double, который без специальных библиотек можно использовать лишь для инженерных/научных расчетов, но никак не для бухгалтерий есть даже специальный вид консалтинга - приходят и начинают код "линтать", на предмет некорректного использования double (первым делом ищут операторы деления и умножения, находят практически каждый раз в новом коде) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 18:28 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
dbpatchandrey_anonymousпропущено... Сам когда-то так полагал (и вроде даже писал на этом форуме). Но там чистый BCD. ой да ладно. base100 это и разновидность BCD Ну покажи вариант BCD, который нельзя назвать "BASE 100" :) dbpatchвсякий IEEE-754 можно представить как number, но не наоборот. Неправда ваша. Пример - выше :) Что до научности - то независимо от системы счисления множество вещественных чисел нельзя представить ни в одном из машинных представлений уже просто ввиду перечислимости представимых множеств. Из первого попавшегося можно почитать здесь: http://www.softelectro.ru/ieee754.html 7.4 Точность представления вещественных чисел в формате IEEE754 А в обсуждаемом случае имеем ошибку преобразования из одного представления в другое просто ввиду несовпадения множеств представимых чисел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 18:39 |
|
||
|
вы думаете что 1+(-1) = 0? а вот и нет
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousdbpatchпропущено... ой да ладно. base100 это и разновидность BCD Ну покажи вариант BCD, который нельзя назвать "BASE 100" :) Я дал ссылку на википедию, все описанные там варианты BCD - не base 100. andrey_anonymousdbpatchвсякий IEEE-754 можно представить как number, но не наоборот. Неправда ваша. Пример - выше :) какой такой пример? с power? ну так power для double выдает искаженный результат, но это не означает, что существует какое-то представимое в double число, которое нельзя воткнуть в number без потери значимых цифр. или еще раз - число, в студию, которое можно присвоить в double, но нельзя такое-же число получить в number без искажений :) andrey_anonymousЧто до научности - то независимо от системы счисления множество вещественных чисел нельзя представить ни в одном из машинных представлений уже просто ввиду перечислимости представимых множеств. Из первого попавшегося можно почитать здесь: http://www.softelectro.ru/ieee754.html 7.4 Точность представления вещественных чисел в формате IEEE754 А в обсуждаемом случае имеем ошибку преобразования из одного представления в другое просто ввиду несовпадения множеств представимых чисел. вот жеж блин :\ где я говорил, что бесконечное множество вещественных чисел можно представить в number? число 0.3(3), как результат 1/3 нельзя представить ни в double, ни в number, без потери точности, это и ежу понятно, речь же была про другое, про то, что не всякий double можно в number - я к этому утверждению (ложному) и придрался говоря проще - я утверждал (вернее предпологаю), что все конечное множество числел double можно поместить в множество number. вот и прошу опровергнуть оное, примерами непомещаемых чисел ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2017, 18:53 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39479068&tid=1885657]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
167ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
84ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 496ms |

| 0 / 0 |
