|
Округление в Firebird 3.0
|
|||
---|---|---|---|
#18+
Есть программа на "Delphi" работающая с базой данных "Firebird SQL" при помощи компонентов "UIB". Программа может работать с "Firebird SQL" версий 1.5.3.4870 и 3.0.3.32900, во встроенном режиме и с сервером по TCP. При работе во встроенном режиме с версией 3.0.3.32900 запрос Код: sql 1.
возвращает результат "16.57", но при подключении по TCP с версией 3.0.3.32900, а также с версией 1.5.3.4870 в любом режиме результат выполнения запроса - "16.58". В программе "isql.exe", запущенной во встроенном режиме с библиотеками "Firebird SQL" 3.0.3.32900, которые поставляются с программой на "Delphi", запрос также возвращает "16.58". Если в программе на "Delphi", во встроенном режиме с версией 3.0.3.32900, перед выполнением запроса вызвать процедуру "SetRoundMode(rmUp)", то результат запроса будет таким же как и в остальных вариантах - "16.58". Если не вызывать "SetRoundMode(rmUp)", то функция "Get8087CW" во всех вариантах подключения возвращает 0x1372. Чем может быть вызвано отличие в результатах запроса, и есть ли способ получить результат "16.58" в всех вариантах без изменения способа округления? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2018, 09:46 |
|
Округление в Firebird 3.0
|
|||
---|---|---|---|
#18+
inoremap, ну а чего ты хочешь. Если используешь Embedded, то Firebird работает в его адресном пространстве и подчиняется правилам которые установлены для твоего приложения ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2018, 12:02 |
|
Округление в Firebird 3.0
|
|||
---|---|---|---|
#18+
inoremapперед выполнением запроса вызвать процедуру "SetRoundMode(rmUp)", то результат запроса будет таким же как и в остальных вариантах - "16.58". Почему не rmNearest? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2018, 12:05 |
|
Округление в Firebird 3.0
|
|||
---|---|---|---|
#18+
inoremapесть ли способ получить результат "16.58" в всех вариантах без изменения способа округления? Есть: никогда не доверяй серверу арифметику сложнее сложения и вычитания. Получай чистый результат и округляй так как тебе нужно самостоятельно. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2018, 12:17 |
|
Округление в Firebird 3.0
|
|||
---|---|---|---|
#18+
Симонов Денисну а чего ты хочешь. Если используешь Embedded, то Firebird работает в его адресном пространстве и подчиняется правилам которые установлены для твоего приложения Встроенный 1.5 возвращает "16.58", и вряд ли "isql.exe" меняет способ округления. Попробую еще сделать UDF с "Get8087CW" для проверки. Симонов ДенисПочему не rmNearest?Во всех вариантах кроме "rmUp" результат - "16.57". ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2018, 12:41 |
|
Округление в Firebird 3.0
|
|||
---|---|---|---|
#18+
fbclient при каждом входе в API запоминает текущую маску сопроцессора, ставит стандартную (в ней округление к ближайшему чётному и замаскированы прерывания) и при выходе из API восстанавливает маску. Проблемы могут быть только если UDF поменяла маску и не восстановила её за собой. inoremapВо всех вариантах кроме "rmUp" результат - "16.57".Верится с трудом ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2018, 12:46 |
|
Округление в Firebird 3.0
|
|||
---|---|---|---|
#18+
hvladinoremapВо всех вариантах кроме "rmUp" результат - "16.57".Верится с трудомПроект с воспроизведением проблемы - https://yadi.sk/d/Nf_DdMP_2zPTmQ в архиве собранный "exe" файл и исходные тексты для Delphi 5. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2018, 13:47 |
|
Округление в Firebird 3.0
|
|||
---|---|---|---|
#18+
inoremap, у нас нет яндекса ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2018, 14:04 |
|
Округление в Firebird 3.0
|
|||
---|---|---|---|
#18+
inoremap, добавь аналогичное округление в Delphi код и выведи его в лог. Потом сделай вот так Код: pascal 1. 2. 3. 4.
И посмотри в отладчике на d - расскажи, что видишь ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2018, 20:29 |
|
Округление в Firebird 3.0
|
|||
---|---|---|---|
#18+
hvladfbclient при каждом входе в API запоминает текущую маску сопроцессора, ставит стандартную (в ней округление к ближайшему чётному и замаскированы прерывания) и при выходе из API восстанавливает маску.Тут я немного ошибся, похоже. В статусном регистре сопроцессора меняется только режим маскирования прерываний, режим округления (и прочее) - не меняется. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2018, 20:31 |
|
Округление в Firebird 3.0
|
|||
---|---|---|---|
#18+
hvladinoremap, добавь аналогичное округление в Delphi код и выведи его в лог. Для этого мне надо понимать как округляет "Firebird SQL" 8-( hvladinoremap, Потом сделай вот так Код: pascal 1. 2. 3. 4.
И посмотри в отладчике на d - расскажи, что видишь Процедура тестирования: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
Результат: Код: plaintext 1. 2. 3. 4. 5.
Собранный исполняемый файл https://drive.google.com/open?id=10wYa4XM5IVNG4hJFjWqVy_f1XbPQSW_2 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 11:28 |
|
Округление в Firebird 3.0
|
|||
---|---|---|---|
#18+
inoremapДля этого мне надо понимать как округляет "Firebird SQL" 8-( ну так проведи эксперимент Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 11:45 |
|
Округление в Firebird 3.0
|
|||
---|---|---|---|
#18+
inoremapДля этого мне надо понимать как округляет "Firebird SQLОн не делает ничего специального. inoremap Код: plaintext
Далее, как видишь, и Delphi (RoundTo), и Firebird округляют одинаково. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 12:18 |
|
Округление в Firebird 3.0
|
|||
---|---|---|---|
#18+
Дело оказалось не в режиме округления, а в точности - в "Deplhi" была установлена "Extended Precision", в серверном варианте "Firebird SQL 3.0" - "Double Precision", после установки точности в "Delphi" в "Double Precision" запрос стал возвращать одинаковый результат как при подключении к серверу, так и во встроенном режиме. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 13:46 |
|
|
start [/forum/topic.php?fid=40&fpage=29&tid=1560926]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
83ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 197ms |
0 / 0 |