powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перемена место множителя в выражении имеет значение
25 сообщений из 38, страница 1 из 2
Перемена место множителя в выражении имеет значение
    #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
Перемена место множителя в выражении имеет значение
    #39844589
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И шо ?

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

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

То что в школе учили, что b и с должны быть равны!
...
Рейтинг: 0 / 0
Перемена место множителя в выражении имеет значение
    #39844608
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProteusТо что в школе учили, что b и с должны быть равны!А в институте ты машинную арифметику ограниченной точности не проходил? Не воинствуй, а включи мозг.
...
Рейтинг: 0 / 0
Перемена место множителя в выражении имеет значение
    #39844616
Фотография -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
Перемена место множителя в выражении имеет значение
    #39844621
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насамом деле, сначала написал не очень вежливый ответ автору, потом "включил мозг" и понял, что я тоже не знаю, как Oracle считает и как его заставить считать правильно.

По правильно, я понимаю считать не в float/double, а с фиксированной точкой. Тупо поменял тип переменных в примере автора на number( 15, 5 ) и понял, что "тупо" не прокатило, а как правильно, я не знаю (((
...
Рейтинг: 0 / 0
Перемена место множителя в выражении имеет значение
    #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
Перемена место множителя в выражении имеет значение
    #39844625
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevПо правильно, я понимаю считать не в float/double, а с фиксированной точкой.Если в выражении нет аргументов binary_float/_double, оно считается с фиксированной точкой.
...
Рейтинг: 0 / 0
Перемена место множителя в выражении имеет значение
    #39844628
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Leonid KudryavtsevПо правильно, я понимаю считать не в float/double, а с фиксированной точкой.Если в выражении нет аргументов binary_float/_double, оно считается с фиксированной точкой.
"Все не так очевидно" ( C )

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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