powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / вы думаете что 1+(-1) = 0? а вот и нет
25 сообщений из 76, страница 2 из 4
вы думаете что 1+(-1) = 0? а вот и нет
    #39479284
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchчисло 0.3(3), как результат 1/3 нельзя представить ни в double, ни в number, без потери точности, это и ежу понятно
Зато 1/3 легко представить в системе счисления по основанию 3 точно также, как 1/7 - в системе счисления по основанию 7, 1/10 - в системе счисления по основанию 10.
Так понятнее?
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39479285
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousНу покажи вариант BCD, который нельзя назвать "BASE 100" :)

base100 это просто конкретный алгоритм и формат представления чисел в виде последовательности байт, а не некое понятие "по основанию 100"

https://amitzil.wordpress.com/2015/03/24/how-are-numbers-saved-in-oracle/

и этот BASE1000 алгоритм подобен BCD алгоритмам IBM, которые делают то или иное кодирование/декодирование и представление в виде байт, но, строго говоря, никогда официально как BCD не назывался
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39479287
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousdbpatchчисло 0.3(3), как результат 1/3 нельзя представить ни в double, ни в number, без потери точности, это и ежу понятно
Зато 1/3 легко представить в системе счисления по основанию 3 точно также, как 1/7 - в системе счисления по основанию 7, 1/10 - в системе счисления по основанию 10.
Так понятнее?

нет, не понятее, как это все основание по 3 относится к теме double vs number

понятное дело, что будь у нас не 10 пальцев, а, допустим, 16, то мы бы использовали систему счисления по основанию 16 (некоторые древние народы даже 60-ричные системы умудрялись использовать), но это уже совсем офтопик и не отвечает на мой вопрос: какое такое впихуемое в double нельзя впихнуть в number?
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39479297
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatchandrey_anonymousпропущено...

Зато 1/3 легко представить в системе счисления по основанию 3 точно также, как 1/7 - в системе счисления по основанию 7, 1/10 - в системе счисления по основанию 10.
Так понятнее?
нет, не понятее, как это все основание по 3 относится к теме double vs number


Пример я приводил выше.
Основания степени для вещественных имеют непосредственное отношение к дистанции между представимыми числами.
number - основание 10
double - основание 2
троичная - основание 3
В любой из этих систем счисления можно реализовать представление степени и мантиссы по аналогии с IEEE754 (кстати, в IEEE-754-2008 появились decimal).

Но при этом множества представимых вещественных чисел между этими системами НЕ совпадут.
1/3 и 1/10 - просто самый очевидный пример несовпадения представимых множеств.
Но 1/2 и 1/10 - тоже не совпадают.
И это медицинский факт.
Конкретный пример для double я привел выше.
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39479305
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousКонкретный пример для double я привел выше.

никакого такого примера я не увидел. пример с power(2,-54) не актуален - обратное преобразование в из number дает изначальный результат:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SQL> SELECT
     i.*,
     DUMP(a),
     DUMP(b),
     CAST(a AS NUMBER),
     DUMP(CAST (a AS NUMBER)),
     DUMP(1)
   FROM (
     SELECT
       a,
       CAST(CAST(a AS NUMBER) AS binary_double) b
     FROM (
       SELECT CAST(1+POWER(2,-54) AS binary_double) a FROM dual
     )
   ) i;
         A          B DUMP(A)                             DUMP(B)                              CAST(AASNUMBER) DUMP(CAST(AASNUMBER))  DUMP(1)
---------- ---------- ----------------------------------- ------------------------------------ --------------- ---------------------- ------------------
         1          1 Typ=101 Len=8: 191,240,0,0,0,0,0,0  Typ=101 Len=8: 191,240,0,0,0,0,0,0                 1 Typ=2 Len=2: 193,2     Typ=2 Len=2: 193,2



еще раз - речь не про выражения, сложения или вычитания и их результат,
речь про конкретное число, которое или может или не может быть преобразовано из double в number без искажений

такое число будет?
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39479437
Elicмолчать и слушать, молчать и слуизбегать применения машинных числовых типов (binary_float & binary_double)Ни один из этих типов не может дать наблюдаемой здесь точности (погрешности)Согласен.
В данном случае не к месту.
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39479440
andrey_anonymousИ в этой связи мне показался слегка странным данный тут совет избегать этих типов.
А в чем странность совета избегать хранения чисел десятичной точности в типах данных двоичной точности?
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39479442
andrey_anonymousНо там чистый BCD.
Код: plsql
1.
Select level-1 n,Dump(cast(Level-1 As Number),16) d From dual Connect By Level<=102


В каком месте там BCD?
Там именно base100.
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39479446
dbpatchчисло, в студию, которое можно присвоить в double, но нельзя такое-же число получить в number без искажений :)
таки их есть на свете, если быть строгими:
1/2=0,5 - 1 значащая цифра
1/2 2 =0,25 - 2 значащие цифры
1/2 3 =0,125 - 3 значащие цифры
1/2 39 и далее = ... - 39+ значащих цифр, более 38 цифр в Number-е не отразишь, приехали :)
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39479447
То есть, если длина мантиссы значения, сохраняемого в binary_double , превышает 38 бит - такое значение невозможно точно отразить во множестве допустимых значений формата Number.
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39479451
aduka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
молчать и слушать, молчать и слу,
1/2 4 =0,0625 - 3 значащие цифры
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39479485
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbpatch(некоторые древние народы даже 60-ричные системы умудрялись использовать), но это уже совсем офтопик и не отвечает на мой вопрос: какое такое впихуемое в double нельзя впихнуть в number?
Некоторые и по сей день минуты и секунды в ней считают. :)
Что касается IEEE-754, то наверное далеко ходить не надо:
Код: plsql
1.
select dump(0),dump(-0),dump(-0d) from dual;



Хотя нонче, не то что давеча . :)
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39479492
aduka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
молчать и слушать, молчать и слуТо есть, если длина мантиссы значения, сохраняемого в binary_double , превышает 38 бит - такое значение невозможно точно отразить во множестве допустимых значений формата Number.
Невозможно, если длина мантиссы превышает 50 бит.
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39479496
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka,

да что вы к мантиссе то привязались:
Код: plsql
1.
2.
select dump(1.79e308d) from dual;
select cast(1.79e308d as number) from dual;
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39479502
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И это еще, даже не спор о том, какое значение sin(
) правильнее. :)
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39479605
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньевaduka,

да что вы к мантиссе то привязались:
Код: plsql
1.
2.
select dump(1.79e308d) from dual;
select cast(1.79e308d as number) from dual;




ок, про мантиссу принято, бревна в глазу я не заметил.

хотя диапазон чисел более 1.0E126 и менее 1.0E-130 вызывает сильные сомнения практического применения, но это уже нытье лузера, ни разу не спорт ;)

долго же вы держались...
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39479607
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
молчать и слушать, молчать и слуdbpatchчисло, в студию, которое можно присвоить в double, но нельзя такое-же число получить в number без искажений :)
таки их есть на свете, если быть строгими:
1/2=0,5 - 1 значащая цифра
1/2 2 =0,25 - 2 значащие цифры
1/2 3 =0,125 - 3 значащие цифры
1/2 39 и далее = ... - 39+ значащих цифр, более 38 цифр в Number-е не отразишь, приехали :)

так их и в Double не отразишь :)
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39479609
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
молчать и слушать, молчать и слуandrey_anonymousНо там чистый BCD.
Код: plsql
1.
Select level-1 n,Dump(cast(Level-1 As Number),16) d From dual Connect By Level<=102


В каком месте там BCD?
Там именно base100.

base 100 относится к семейству BCD. BCD форматов существует масса разновидностей, абсолютно между собой не совместимых.
у них только одно общее - они все кодируют десятичные цифры, а не двоичные, все остальное - произвольно (форматы и алгоритмы)
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39479737
aduka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbpatchмолчать и слушать, молчать и слупропущено...

таки их есть на свете, если быть строгими:
1/2=0,5 - 1 значащая цифра
1/2 2 =0,25 - 2 значащие цифры
1/2 3 =0,125 - 3 значащие цифры
1/2 39 и далее = ... - 39+ значащих цифр, более 38 цифр в Number-е не отразишь, приехали :)

так их и в Double не отразишь :)

Число 2 130 = 1024 13 > 1000 13 = 10 39 имеет более 39 значащих цифр и не может быть представлено в Number. В двоичном представлении оно имеет только 1 значащую цифру, и поэтому должно представляться в Double точно.
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39479752
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adukadbpatchпропущено...


так их и в Double не отразишь :)

Число 2 130 = 1024 13 > 1000 13 = 10 39 имеет более 39 значащих цифр и не может быть представлено в Number. В двоичном представлении оно имеет только 1 значащую цифру, и поэтому должно представляться в Double точно.

ок, уделал, мое почтение!

прикольно осознавать, что ты (в смысле я) сел в лужу. верификацию double vs number мы делали для финансовых данных почти лет двадцать назад (там больше 1000 триллионов величины не имеют практического смысла, если ты не в Зимбабве)

на астрономические величины проверить тогда как-то не подумалось, каюсь
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39479766
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adukaЧисло 2 130 = 1024 13 > 1000 13 = 10 39 имеет более 39 значащих цифр и не может быть представлено в Number.Не может храниться в NUMBER(38). Безразмерный NUMBER может быть до 40 значащих цифр:
Код: plsql
1.
2.
DUMP(TO_CHAR(POWER(2,130)))
Typ=1 Len=40: 49,51,54,49,49,50,57,52,54,55,54,56,51,55,53,51,56,53,51,56,53,51,52,57,56,52,50,57,55,50,55,48,55,50,56,52,53,56,50,52
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39480004
aduka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aduka
Число 2 130 = 1024 13 > 1000 13 = 10 39 имеет более 39 значащих цифр и не может быть представлено в Number. В двоичном представлении оно имеет только 1 значащую цифру, и поэтому должно представляться в Double точно.

dbpatch, нет, это я ошибся. Это утверждение верно только теоретически. Решил проверить его на практике, и оказалось, что число 2 56 в Double сохраняется точно, а вот число 2 57 округляется (144115188075855870 вместо 144115188075855872). Вот такая засада с Double.
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39480017
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adukaadukaЧисло 2 130 = 1024 13 > 1000 13 = 10 39 имеет более 39 значащих цифр и не может быть представлено в Number. В двоичном представлении оно имеет только 1 значащую цифру, и поэтому должно представляться в Double точно.

dbpatch, нет, это я ошибся. Это утверждение верно только теоретически. Решил проверить его на практике, и оказалось, что число 2 56 в Double сохраняется точно, а вот число 2 57 округляется (144115188075855870 вместо 144115188075855872). Вот такая засада с Double.

не важно, в любом случае мантисса в double может быть больше, чем в number, т.е. уже есть класс чисел, которые нельзя сконвертировать
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39480058
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, все самое интересное пропустил.
Вот пример без "астрономии" (double):
3FBF9ADD3746F67D=0,12345678901234609370352046653351862914860248565673828125
...
Рейтинг: 0 / 0
вы думаете что 1+(-1) = 0? а вот и нет
    #39480062
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousБлин, все самое интересное пропустил.
Вот пример без "астрономии" (double):
3FBF9ADD3746F67D=

0,12345678901234609370352046653351862914860248565673828125

диаметр Млечного Пути примерно

946073047258080000000000 миллиметров


если вон то число взять как угол в радианах, да в последнюю пятерку заменить на 6, какое уголовое отконение даст это в масштабах нашей Галактики (берем катеты равными диаметру Галактики, насколько изменится гипотенуза?)
...
Рейтинг: 0 / 0
25 сообщений из 76, страница 2 из 4
Форумы / Oracle [игнор отключен] [закрыт для гостей] / вы думаете что 1+(-1) = 0? а вот и нет
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]