Главная страница
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.49 MB
Время: 0.009 c
11-1240042285
imp
2009-04-18 12:11
2011.12.18
Перемещение закладок в TKOLTabControl


15-1314945552
ClawClaw
2011-09-02 10:39
2011.12.18
Составление расписание в ВУЗе


2-1315866669
WorkWork
2011-09-13 02:31
2011.12.18
SQL-запрос в Access


1-1277298765
granulated
2010-06-23 17:12
2011.12.18
EInvalidPointer после выхода из функции.


2-1315384691
yurikon
2011-09-07 12:38
2011.12.18
Имя MSSQL сервера