|
|
|
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
|
|||
|---|---|---|---|
|
#18+
В общем глюки при вычитании... к примеру Вот в одну ячейку памяти я всегд добавляю некоторые значения, к примеру: 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 ЧТО ДЕЛАТЬ!!!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2002, 14:24:08 |
|
||
|
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
|
|||
|---|---|---|---|
|
#18+
слишком много написал В общем, нужно решить вопрос почему следующий код выдает разные результаты? И что сделать, чтобы результаты при работе с переменной были идентичны? DECLARE @Q float SET @Q=1234567*0.035 select @Q SELECT 1234567*0.035 ------------- 43209.845000000001 43209.845 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2002, 14:26:53 |
|
||
|
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
|
|||
|---|---|---|---|
|
#18+
Ну какие же это глюки? Посмотрите select datalength(@Q). 8 байт расходуются под мантиссу и показатель. В итоге precision (т.е. кол-во цифр в числе) для типа float = 15 в соответствии со стандартом IEEE 754. SQL Server представляет ваше @Q в виде 0.43209845e5 и ручается за правильное представление 15 знаков после запятой. У вас ошибка появляется в 17-м знаке. Чего же вы недовольны? Хотите иметь точность в 20 знаков после запятой - используйте тип decimal. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2002, 15:26:49 |
|
||
|
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
|
|||
|---|---|---|---|
|
#18+
хорошо... тогда в какой тип реально перейти, чтобы проблем небыло при вычислении ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2002, 15:38:51 |
|
||
|
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
|
|||
|---|---|---|---|
|
#18+
в соответствии со стандартом IEEE 754. SQL Server представляет ваше @Q в виде 0.43209845e5 и ручается за правильное представление 15 знаков после запятой. А он может понять, что мне после 43209.845 не нужно никаких знаков? Почему Delphi это понимает ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2002, 15:43:17 |
|
||
|
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
|
|||
|---|---|---|---|
|
#18+
Блин - ну почитайте хоть что-нибудь о программировании - и особенно о типах данных. Это ж если не в школе, то на первом курсе точно проходят... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2002, 15:45:59 |
|
||
|
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
|
|||
|---|---|---|---|
|
#18+
Сколько стандарту IEEE 754 лет? ЧТо, стандарты всегда правы? Может их со временем нужно менять? Хорошо... тогда такой вопрос: почему он нормально вычисляет? select 1234567*0.035 Как это он вычисляет так, что выдается нормальный результат, т.е. 43209.845 а не 43209.845000000001 как в случае с переменными типа float. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2002, 15:50:49 |
|
||
|
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
|
|||
|---|---|---|---|
|
#18+
Сколько стандарту 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)) Иначе как он поймет, сколько действительно знаков после запятой вам нужно ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2002, 16:44:07 |
|
||
|
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
|
|||
|---|---|---|---|
|
#18+
Попровочка к скрипту Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2002, 16:46:59 |
|
||
|
Большие глюки с арифметикой в MS SQL 2000 SP2 !!!! УЖАС!!!!
|
|||
|---|---|---|---|
|
#18+
Float - must die! Оставим его только астрономам. To Glory. Ну зачем так много ссылок. Мне кажется, что приближеные вычисления я проходил в шестом классе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2002, 19:00:58 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32036597&tid=1821818]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
154ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 452ms |

| 0 / 0 |
