Форум: "Прочее";
Текущий архив: 2011.12.18;
Скачать: [xml.tar.bz2];
ВнизЦелочисленное деление mysql и... Найти похожие ветки
← →
Дмитрий С © (2011-08-29 08:32) [0].. всем прочем, где явно нет такого оператора как div.
Здравый смысл подсказывает, что FLOOR(123/20) == 123 div 20, но возникает 2 вопрос:
1. Почему нет явного оператора целочисленного деления (или как его называют деления с остатком), который быстрее будет преобразований и округлений?;
2. Может ли дать сбой функция FLOOR, когда результат и так целое число? Например, FLOOR(40/20). 40/20 по идее может дать результат подобный 1.99999999999..., который функция FLOOR превратит в 1.
По идее более надежным будет такой способ: a div b == round((a - a%b)/b)
← →
И. Павел © (2011-08-29 08:49) [1]> 40/20 по идее может дать результат подобный 1.99999999999
Если не ошибаюсь, погрешность при работе с числами с плавающей запятой возникает только в нецелой части (из-за особенности представления этой части в двоичном виде - там для определения очередной цифры идет деление на два). Целая часть, кажется, всегда считается точно.
PS: В MySQL есть функции для определения остатка: http://sevidi.ru/webd/dweb/phppage43.php
← →
Anatoly Podgoretsky © (2011-08-29 09:05) [2]> Дмитрий С (29.08.2011 08:32:00) [0]
В большинстве СУБД тип деления определяется операндами, а mysql это странная
СУБД, там может быть все не так.
← →
Anatoly Podgoretsky © (2011-08-29 09:07) [3]> И. Павел (29.08.2011 08:49:01) [1]
Учитывая, что обычно числа нормальнованы, и целая часть всегда равна нулю.
"Целая" часть всегда считает точно, не потому что целая, а потому что это
точная дробь
← →
Омлет © (2011-08-29 09:25) [4]Так там есть div: http://dev.mysql.com/doc/refman/5.1/en/arithmetic-functions.html#operator_div
← →
Дмитрий С © (2011-08-29 09:46) [5]
> Омлет © (29.08.11 09:25) [4]
>
> Так там есть div: http://dev.mysql.com/doc/refman/5.1/en/arithmetic-
> functions.html#operator_div
Ух ты. Надо бы время от времени обновлять скаченный мануал:) Спасибо!
← →
Дмитрий С © (2011-08-29 09:48) [6]
> И. Павел ©
> Anatoly Podgoretsky ©
А можно более земным языком? интересно.
← →
Anatoly Podgoretsky © (2011-08-29 10:20) [7]123/20 это целочисленое деление, а 123/0.20 с плавающей запятой
← →
Anatoly Podgoretsky © (2011-08-29 10:24) [8]123/20.0
← →
И. Павел © (2011-08-29 10:41) [9]> А можно более земным языком? интересно.
Вот, наверное, лучшая статья про погрешности в плавающей арифметике: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374 .
Вот моя попытка обяснить, почему целые числа представляются точно, получилось не очень понятно, но после прочтения статьи скорее всего, это будет и так очевидно:
Если при вычислении в качестве ответа будет число 0.1, то погрешность возникнет потому, что 0.1 в двоичной системе счисления - бесконечная дробь (т.к. ее нельзя выразить суммой степеней двойки) и она будет обрезана справа. А любое целое число можно выразить суммой степеней двойки, поэтому из них не выйдет бесконечных дробей (потом эту часть делят на 2 в какой-то степени, сдвигая вправо, за запятую, для нормальзации и если число отрицательное, но числовое представление ее при этом останется прежним - не бесконечным).
← →
И. Павел © (2011-08-29 10:46) [10]> и если число отрицательное
то еще в виде доп. кода представляют, но это тоже не делает дробь бесконечной
← →
Inovet © (2011-08-29 11:03) [11]> [10] И. Павел © (29.08.11 10:46)
> > и если число отрицательное
>
> то еще в виде доп. кода представляют, но это тоже не делает дробь бесконечной
Это про FPU? И почему отрицательные оговорёны особенно?
← →
И. Павел © (2011-08-29 11:13) [12]> Это про FPU? И почему отрицательные оговорёны особенно?
Я спутался. У отрицательных чисел с плавающей запятой мантисса не меняется и [10] тоже, конечно, не правильно.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2011.12.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c