Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.18;
Скачать: CL | DM;

Вниз

Целочисленное деление 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.01 c
4-1253007852
harisma
2009-09-15 13:44
2011.12.18
Проверка существования папки


2-1315833646
patrick1968
2011-09-12 17:20
2011.12.18
Доступ с правами определенного пользователя


15-1312615274
PreDatoR
2011-08-06 11:21
2011.12.18
Ваши любимые компьютерные игры


15-1314390597
Юрий
2011-08-27 00:29
2011.12.18
С днем рождения ! 27 августа 2011 суббота


2-1315955658
WorkWork
2011-09-14 03:14
2011.12.18
SQL-запрос с диапозоном даты