Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!! / 11 сообщений из 11, страница 1 из 1
13.07.2002, 14:24:08
    #32036591
XDefender
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
В общем глюки при вычитании...

к примеру
Вот в одну ячейку памяти я всегд добавляю некоторые значения, к примеру:

1234567*0,035
+
1234567*0,035
+
1*0,035
+
1*0,035


В общем, все без проблем... нормально вычисляет

Затем
-
1234567*0,035
-
1*0,035
-
1234567*0,035

и по правилам у меня должно остаться: 0,035

а что получается -

-3,50000000034925E-02

т.е вот такая погрешность
0,00000000034925.

Как сделать чтобы все нормально вычисляло? а то я до нуля не дойду...

а вот уже когда 1*0,035 вычту, получаю

-3,49245632413897E-12

как тут избавиться??

PS: Все типы - float.

Как я понимаю, погрешности то возникают при умножении * 0.035

Как от них избавиться ?

да и вообще, конструкция типа

DECLARE @Q float

SET @Q=1234567*0.035
select @Q

SELECT 1234567*0.035

выдает разные результаты:
43209.845000000001
43209.845

ЧТО ДЕЛАТЬ!!!!!
...
Рейтинг: 0 / 0
13.07.2002, 14:26:53
    #32036592
XDefender
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
слишком много написал
В общем, нужно решить вопрос
почему следующий код выдает разные результаты? И что сделать, чтобы результаты при работе с переменной были идентичны?


DECLARE @Q float

SET @Q=1234567*0.035
select @Q
SELECT 1234567*0.035

-------------
43209.845000000001
43209.845
...
Рейтинг: 0 / 0
13.07.2002, 15:26:49
    #32036595
Дед Маздай
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
Ну какие же это глюки? Посмотрите select datalength(@Q). 8 байт расходуются под мантиссу и показатель. В итоге precision (т.е. кол-во цифр в числе) для типа float = 15 в соответствии со стандартом IEEE 754. SQL Server представляет ваше @Q в виде 0.43209845e5 и ручается за правильное представление 15 знаков после запятой. У вас ошибка появляется в 17-м знаке. Чего же вы недовольны? Хотите иметь точность в 20 знаков после запятой - используйте тип decimal.
...
Рейтинг: 0 / 0
13.07.2002, 15:38:51
    #32036597
XDefender
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
хорошо... тогда в какой тип реально перейти, чтобы проблем небыло при вычислении ?
...
Рейтинг: 0 / 0
13.07.2002, 15:43:17
    #32036598
XDefender
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
в соответствии со стандартом IEEE 754. SQL Server представляет ваше @Q в виде 0.43209845e5 и ручается за правильное представление 15 знаков после запятой.
А он может понять, что мне после

43209.845 не нужно никаких знаков?

Почему Delphi это понимает ?
...
Рейтинг: 0 / 0
13.07.2002, 15:45:59
    #32036599
Alexander_Chepack
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
Блин - ну почитайте хоть что-нибудь о программировании - и особенно о типах данных. Это ж если не в школе, то на первом курсе точно проходят...
...
Рейтинг: 0 / 0
13.07.2002, 15:50:49
    #32036600
XDefender
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
Сколько стандарту IEEE 754 лет?
ЧТо, стандарты всегда правы? Может их со временем нужно менять?


Хорошо... тогда такой вопрос:
почему он нормально вычисляет?

select 1234567*0.035

Как это он вычисляет так, что выдается нормальный результат, т.е. 43209.845 а не 43209.845000000001 как в случае с переменными типа float.
...
Рейтинг: 0 / 0
13.07.2002, 16:44:07
    #32036601
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
Сколько стандарту IEEE 754 лет?
2002 - 1985 = 17 лет

ЧТо, стандарты всегда правы?
Стандарты создаются для единообразия, а не для доказательства правоты/неправоты

Как это он вычисляет так, что выдается нормальный результат, т.е. 43209.845 а не 43209.845000000001 как в случае с переменными типа float

Из-за того, что тип float ИЗНАЧАЛЬНО предусматривает ПРИБЛИЗИТЕЛЬНЫЕ вычисления, то
- SQL вычисляет результаты так, как "УДОБНО" ему, но в соответствии с IEEE 754
- клиентское приложение также может вычислять и отображать числа с плавающей точкой в соответствии со своей логикой

Вот немного теории (если вам интересно)
Представление чисел в ЭВМ
Погрешности машинных операций
Вычисление скалярных произведений


Можете также "поиграться" здесь
IEEE-754 Floating-Point Conversion

А он может понять, что мне после 43209.845 не нужно никаких знаков?
Ну так донесите ваше желение до сервера
SELECT 1234567*CAST(0.035 AS float), 1234567 * CAST(CAST(0.035 AS float) AS decimal(10,3)), 1234567 * CAST(CAST(0.035 AS float) AS decimal(10,5))
Иначе как он поймет, сколько действительно знаков после запятой вам нужно ?
...
Рейтинг: 0 / 0
13.07.2002, 16:46:59
    #32036602
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
Попровочка к скрипту

Код: plaintext
1.
SELECT  1234567 *CAST( 0 . 035  AS float), CAST( 1234567  * CAST( 0 . 035  AS float) AS decimal( 10 , 3 )), CAST( 1234567  * CAST( 0 . 035  AS float) AS decimal( 10 , 5 ))
...
Рейтинг: 0 / 0
13.07.2002, 19:00:58
    #32036605
Cat2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
Float - must die!
Оставим его только астрономам.
To Glory.
Ну зачем так много ссылок.
Мне кажется, что приближеные вычисления я проходил в шестом классе.
...
Рейтинг: 0 / 0
13.07.2002, 22:32:33
    #32036612
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
2 Cat2

Повторение - мать учения.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!! / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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