Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перемена место множителя в выражении имеет значение / 25 сообщений из 38, страница 1 из 2
02.08.2019, 12:45
    #39844580
Proteus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
Выражение меняет значение при изменении последовательности его вычисления.

Код: 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.
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 
SET SERVEROUTPUT ON
declare
  -- Local variables here
  i NUMBER;
  a NUMBER;
  b NUMBER;
  c NUMBER;
begin
  -- Test statements here
  i := 0.0725* 2 / 300;
  dbms_output.put_line ('i='||i);
  a := 30900 * i ;
  b := 30900 * 0.0725* 2 / 300;
  c := 0.0725* 2 / 300 * 30900;
  dbms_output.put_line ('a='||a);
  dbms_output.put_line ('b='||b);
  dbms_output.put_line ('c='||c);
  dbms_output.put_line ('round(a,2)='||ROUND(a,2));
  dbms_output.put_line ('round(b,2)='||ROUND(b,2));
  dbms_output.put_line ('round(c,2)='||ROUND(c,2));
end;
/
i=,000483333333333333333333333333333333333333
a=14,93499999999999999999999999999999999999
b=14,935
c=14,93499999999999999999999999999999999999
round(a,2)=14,93
round(b,2)=14,94
round(c,2)=14,93
 
PL/SQL procedure successfully completed
...
Рейтинг: 0 / 0
02.08.2019, 12:57
    #39844589
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
И шо ?

Правила округления в школе не проходил
14,934(9) = 14.94
все правильно
...
Рейтинг: 0 / 0
02.08.2019, 13:05
    #39844595
Proteus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
Leonid KudryavtsevИ шо ?

Правила округления в школе не проходил
14,934(9) = 14.94
все правильно

То что в школе учили, что b и с должны быть равны!
...
Рейтинг: 0 / 0
02.08.2019, 13:16
    #39844608
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
ProteusТо что в школе учили, что b и с должны быть равны!А в институте ты машинную арифметику ограниченной точности не проходил? Не воинствуй, а включи мозг.
...
Рейтинг: 0 / 0
02.08.2019, 13:22
    #39844616
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
ProteusВыражение меняет значение при изменении последовательности его вычисления.Для демонстрации очевидного незачем так многобуквенно излагать код. Достаточно
Код: plsql
1.
2.
3.
4.
5.
select sign(1*3/3-1/3*3) from dual;

SIGN(1*3/3-1/3*3)
-----------------
                1
...
Рейтинг: 0 / 0
02.08.2019, 13:29
    #39844621
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
Насамом деле, сначала написал не очень вежливый ответ автору, потом "включил мозг" и понял, что я тоже не знаю, как Oracle считает и как его заставить считать правильно.

По правильно, я понимаю считать не в float/double, а с фиксированной точкой. Тупо поменял тип переменных в примере автора на number( 15, 5 ) и понял, что "тупо" не прокатило, а как правильно, я не знаю (((
...
Рейтинг: 0 / 0
02.08.2019, 13:37
    #39844624
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
А где в доке описывается порядок определения типов (точности) при вычислениях в PL/SQL ?
сходу в И-нете не нашел (((

Код: sql
1.
2.
3.
4.
5.
declare
  n number( 15, 4 );
begin
  n := 30900 * 0.0725 * 2 / 300;
end;


В чем считать будет? В number(15,4) или в float ?
Как правильно указать, что считать в number(15,4) ?
...
Рейтинг: 0 / 0
02.08.2019, 13:38
    #39844625
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
Leonid KudryavtsevПо правильно, я понимаю считать не в float/double, а с фиксированной точкой.Если в выражении нет аргументов binary_float/_double, оно считается с фиксированной точкой.
...
Рейтинг: 0 / 0
02.08.2019, 13:43
    #39844628
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
-2-Leonid KudryavtsevПо правильно, я понимаю считать не в float/double, а с фиксированной точкой.Если в выражении нет аргументов binary_float/_double, оно считается с фиксированной точкой.
"Все не так очевидно" ( C )

С какой фиксированной точкой? Откуда Oracle узнает требуемую точность констант. И, самое главное, как ее указать.

Подозреваю, что константа 0.0725 как раз и есть binary_float. Нужно ли и как ее привести к fixed виду?

p.s. возможно несу бред, просьба меня простить. Просто ткнулся вроде в очевидную вещь и понял, что не понимаю (((
...
Рейтинг: 0 / 0
02.08.2019, 14:06
    #39844632
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
Leonid KudryavtsevПодозреваю, что константа 0.0725 как раз и есть binary_float.Если не указан суффикс, то константа имеет тип number. В sql операнды смешанных числовых выражений приводятся к типу по приоритету binary_double, binary_float, number. Вычисление выражения производится с внутренней точностью binary_double или number(40). В plsql целые числа в пределах 32х разрядов обрабатываются как pls_integer.
...
Рейтинг: 0 / 0
02.08.2019, 14:38
    #39844645
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
Leonid Kudryavtsevа как правильно, я не знаю (((
Elic уже дал вполне достаточную подсказку.
Собственно, программистов обычно этому учат в явном виде.
Классическая тестовая задача - как подсчитать сумму некоего массива с наименьшей потерей точности.
...
Рейтинг: 0 / 0
02.08.2019, 14:39
    #39844646
Mr.Fontaine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
ProteusLeonid KudryavtsevИ шо ?

Правила округления в школе не проходил
14,934(9) = 14.94
все правильно

То что в школе учили, что b и с должны быть равны!
А тебя не удивляет, что a и с равны?
...
Рейтинг: 0 / 0
02.08.2019, 14:59
    #39844652
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
все сводится к двум строкам
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
DECLARE
  c NUMBER;
  b NUMBER;
BEGIN

    b := 30900 * 0.0725* 2 / 300;
    c := 0.0725* 2 / 300 * 30900;

    dbms_output.put_line ('b='||b);
    dbms_output.put_line ('c='||c);

    dbms_output.put_line ('round(b,2)='||ROUND(b,2));
    dbms_output.put_line ('round(c,2)='||ROUND(c,2));

END;


b=14,935
c=14,93499999999999999999999999999999999999
round(b,2)=14,94
round(c,2)=14,93


в первом случае результат 30900 * 0.0725* 2 делится на 3 без остатка
во втором случае результат 0.0725* 2 НЕ делится на 3 без остатка
...
Рейтинг: 0 / 0
02.08.2019, 15:01
    #39844656
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
а тут все идентично
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DECLARE
  c NUMBER;
  b NUMBER;
BEGIN

    b := 30900 * 0.0725* 2 / 3001;
    c := 0.0725* 2 / 3001 * 30900;

    dbms_output.put_line ('b='||b);
    dbms_output.put_line ('c='||c);

    dbms_output.put_line ('round(b,2)='||ROUND(b,2));
    dbms_output.put_line ('round(c,2)='||ROUND(c,2));

END;

b=1,4930023325558147284238587137620793069
c=1,4930023325558147284238587137620793069
round(b,2)=1,49
round(c,2)=1,49
...
Рейтинг: 0 / 0
02.08.2019, 15:26
    #39844674
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
Всегда знал, что округление это занятно.

Еще и интерфейс приложений может радости добавить. Копи-паст результат одного запроса в другой - и получи неверный ответ.

Код: sql
1.
2.
3.
4.
5.
select 0.0725 * 2 / 300 * 30900 as "Видишь девятки? А они тут есть" from dual;

select round( 14.935, 2 ) from dual;

select round( 0.0725 * 2 / 300 * 30900, 2 ) from dual;




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
...
Рейтинг: 0 / 0
02.08.2019, 15:30
    #39844677
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
andrey_anonymous
Меня растроило, что я почему-то наивно думал, что SQL ( PL/SLQ ) типизированный язык.
И если явно указана точность, то с такой точностью он и должен считать.

А, как верно ответил elic, он считает с максимальной точностью или вообще в binary_double, что IMHO как-то для типизированного языка не совсем правильно.
...
Рейтинг: 0 / 0
02.08.2019, 15:31
    #39844678
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
Leonid KudryavtsevВсегда знал, что округление это занятно.Возьми паузу и сразу диссертацию напиши про деление на 3, округление округления, сумму округлений и округление суммы,...
...
Рейтинг: 0 / 0
02.08.2019, 15:33
    #39844683
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
Leonid KudryavtsevА, как верно ответил elic, он считает с максимальной точностью или вообще в binary_double, что IMHO как-то для типизированного языка не совсем правильно.
1. Elic отметил совсем не это.
2. Ну и какая точность у number()?
3. Приведите пожалуйста Ваше понимание " такой точностью он и должен считать" на примере этого топика.
...
Рейтинг: 0 / 0
02.08.2019, 15:36
    #39844687
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
Leonid KudryavtsevИ если явно указана точность, то с такой точностью он и должен считать. Может ли INT-параметр иметь дробную часть? - Увы...
...
Рейтинг: 0 / 0
02.08.2019, 16:09
    #39844699
Тролин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
Ответ тех.поддержки
Incorrect Results Returned by ROUND Function (Doc ID 1936942.1)
...
Рейтинг: 0 / 0
02.08.2019, 17:03
    #39844734
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
andrey_anonymous...
Классическая тестовая задача - как подсчитать сумму некоего массива с наименьшей потерей точности.
andrey_anonymous,

Это интересно.

на эту тему мне известно четыре захода:
сортировать asc и складывать,
сложение по Кахану,
сложение по Ноемайеру,
то, что можно было бы назвать "сложением по Кислицину" - складывать на двоичном счетчике-абаке.

Какой из них вы используете хоть в каких-нибудь вычислениях, не используете никакой, или используете некий пятый метод?
...
Рейтинг: 0 / 0
02.08.2019, 17:57
    #39844773
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
booby,

Деление. -2- уже намекнул: "напиши про деление на 3". Вот и скажи какой из "четыре захода" определит какая точность результата деления 1 на 3.

SY.
...
Рейтинг: 0 / 0
02.08.2019, 18:12
    #39844784
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
SY,
Извини, это выглядит как подмена понятий.

вычитание для демонстрации катастрофической потери точности ничем не хуже деления - понятнее и проще.
Думаю, что про деление на 3 -2-, вероятнее всего, говорил в контексте точности представления числа 1/3 в первую очередь.

Поясню - меня сейчас не интересует минимизация потери точности при произвольном вычислении.

я задал более простой вопрос - касающийся "классической тестовой задачи", пытающейся минимизировать её потерю при простом
сложении, существенно более стабильным в отношении скорости нарастания ошибки по отношению и к вычитанию и к делению.
...
Рейтинг: 0 / 0
02.08.2019, 18:21
    #39844792
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
SY"напиши про деление на 3"

не очень понятно, в чем проблема деления на 3, это всего лишь сдвиг на один разряд вправо в троичной системе счисления
...
Рейтинг: 0 / 0
02.08.2019, 23:16
    #39844866
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перемена место множителя в выражении имеет значение
Leonid Kudryavtsevне очень понятно, в чем проблема деления на 3, это всего лишь сдвиг на один разряд вправо в троичной системе счисленияТебе доставляет удовольствие прикидываться тупым или ты действительно?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перемена место множителя в выражении имеет значение / 25 сообщений из 38, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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