|
SQLite и DBL_MAX, значение по умолчанию и не только
|
|||
---|---|---|---|
#18+
Всем доброго и времени суток тоже. Задача, в общем, такая: есть DBL_MAX = 1.7976931348623158e+308. При добавлении значения в поле f1 таблицы t1, заявленное, как SQLITE_FLOAT запроса insert into t1(f1) values(1.7976931348623158e+308) база не понимает и на чтение выдает 1.#INF. Вменяемые значения возвращаются при записи числа несколько меньшего, примерно 1.7976931348623140e+308. При работе через sqlite3_bind_double проблема исчезает, что записано, то и возвращается, тютелька в тютельку. Но, возникает следующая задача - сделать таблицу со значением поля по умолчанию аккурат в DBL_MAX. запрос insert into t1 values(?) работает вполне. а вот на запрос create table t1(f1 SQLITE_FLOAT default ?) базочка возражает, что вопросительных знаков не хотет. Вопрос - как такое можно сделать? за идеи спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2011, 20:32 |
|
SQLite и DBL_MAX, значение по умолчанию и не только
|
|||
---|---|---|---|
#18+
Скажи пожалуйста, а откуда ты взял тип данных SQLITE_FLOAT и константу DBL_MAX? И заодно ответь: Зачем тебе такая точность? Если уж ты начал оперировать астрономическими числами, может стоит посмотреть на соответствующие библиотеки (GMP например)? А то писать такие числа в базу не велика премудрость, но что ты с ними дальше делать собираешься это загадка. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2011, 23:11 |
|
SQLite и DBL_MAX, значение по умолчанию и не только
|
|||
---|---|---|---|
#18+
отвечаю, по порядку: SQLITE_FLOAT - один из пяти внутренних типов данных SQLite. http://www.sqlite.org/datatype3.html на основе приведения типов (по ссылке), если в таблице присутствует "FLOA", значение хранится, как, цитирую, REAL. The value is a floating point value, stored as an 8-byte IEEE floating point number. от так. DBL_MAX - константа из файла float.h стандартной библиотеки c, есть даже в украинской педивикии, ограничение в работе с плавающей точкой. тоже где-то так, константа взята не с потолка. касательно актуальности задачи - вопрос, согласен. изначально была объектная БД, и в поле координат (например) значение считалось не заданным, если стояло DBL_MAX. соответственно, есть килотонны кода, где ентот DBL_MAX уже используется, ноги, тащемта, выросли оттуда. Согласен, реляционные БД имеют такую штуку, как NULL (SQLITE_NULL в данном случае), но тем не менее, мне уже тупо интересно. собственно, два вопроса: почему при конвертации из строки возникает ошибка (число неправильно, походу, конвертируется внутре SQLite) и, вдогонку, почему при создании таблиц нельзя пользоваться байндом? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2011, 10:27 |
|
SQLite и DBL_MAX, значение по умолчанию и не только
|
|||
---|---|---|---|
#18+
Sniff-Kadabra, Число с плавающей запятой не имеет единого представления, потому использовать его как константу для сравнения - нельзя. Никогда и нигде. Все написанное имхо похоже на попытку раздуть флейм, прикидываясь новичком. "8-byte IEEE floating point number" - это что за упырь такой? Версий стандарта много, да и о котором идет речь еще вопрос. Есть IEEE 754 (см. http://en.wikipedia.org/wiki/IEEE_754), но покажите где вы там увидели требования реализации для чисел диапазона 1e+308. Вообще достаточно прочитать http://www.sqlite.org/datatype3.html http://en.wikipedia.org/wiki/Floating_point ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 01:03 |
|
SQLite и DBL_MAX, значение по умолчанию и не только
|
|||
---|---|---|---|
#18+
MGB, ссылку на SQLite/типы данных я привел постом выше, перепост - весч, читайте все посты, их было три, это не так уж сложно. касательно сравнения значений типа DOUBLE - ясен пень, есть точность вычислений и все такое. При этом код вида #include <float.h> ... double d = DBL_MAX; //1.7976931348623158e+308 if(d==DBL_MAX) { естественно выполнится вот тут, хотя в d будет значение, отличное в последней цифре (хвост 7999...) } проблема в том, что 1) результат выполнения кода 1.1) sprintf(str,"insert into table values(%e)",d); sqlite3_prepare_v2(...,str,...);... и кода 1.2) sqlite3_prepare_v2(...,"insert into table values(?)"); sqlite3_bind_double(..,d); ... существенно различается. в первом случае на чтение имеем 1.#INF, во втором - в точности DBL_MAX. и 2) при создании таблицы невозможно (или у меня руки кривые) пользоваться sqlite3_bind... . ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 11:11 |
|
SQLite и DBL_MAX, значение по умолчанию и не только
|
|||
---|---|---|---|
#18+
Sniff-KadabraMGB, ссылку на SQLite/типы данных я привел постом выше, перепост - весч, читайте все посты, их было три, это не так уж сложно. Троллинг детектед. Sniff-Kadabraпроблема в том, что ... sprintf(str,"insert into table values(%e)",d);... ... на чтение имеем 1.#INF... Имеем ровно то, что и должно быть согласно документации на функцию sprintf. Попытка привести огромное число к int (аргумент "d" в функции sprintf) приводит к переполнению, в результате получаем то, что получаем. Sniff-Kadabraи 2) при создании таблицы невозможно (или у меня руки кривые) пользоваться sqlite3_bind... . Да, невозможно, согласно документации SQLite. P.S. Просьба к модератору удалить нафиг этот мусорный топик. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 13:45 |
|
SQLite и DBL_MAX, значение по умолчанию и не только
|
|||
---|---|---|---|
#18+
сломаный детектор детектед. во-первых, где вы увидели приведение к типу int? протрите глазки, тип - %e, а вот d - это число типа double. Да, невозможно, согласно документации SQLite ссылочку или цитаточку можно? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 14:31 |
|
SQLite и DBL_MAX, значение по умолчанию и не только
|
|||
---|---|---|---|
#18+
Sniff-Kadabraво-первых, где вы увидели приведение к типу int? протрите глазки, тип - %e, а вот d - это число типа double. Да, неправильно прочитал, однобуквенные имена переменных и отсутствие форматирования этому способствуют. Тем не менее, функция sprintf к эскулайт отношения не имеет. Sniff-Kadabraссылочку или цитаточку можно? Читаем введение http://www.sqlite.org/cintro.html а именно раздел "3.0 Binding Parameters and Reusing Prepared Statements" Чтобы узнать, что есть "параметр" открываем указанную в тексте ссылку http://www.sqlite.org/lang_expr.html#varparam и видим авторA "variable" or "parameter" token specifies a placeholder in the expression for a value that is filled in at runtime using the sqlite3_bind() family of C/C++ interfaces. Ровно то же самое можно найти и читая описание функций биндинга http://www.sqlite.org/c3ref/bind_blob.html При желании, можно и что есть expression уточнить себе http://www.sqlite.org/lang_expr.html На диаграмме указано возможное размещение параметров биндинга. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 16:34 |
|
SQLite и DBL_MAX, значение по умолчанию и не только
|
|||
---|---|---|---|
#18+
Sniff-KadabraSQLITE_FLOAT - один из пяти внутренних типов данных SQLite. http://www.sqlite.org/datatype3.html читай эту страницу внимательнее. Типа SQLITE_FLOAT не существует. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 18:01 |
|
SQLite и DBL_MAX, значение по умолчанию и не только
|
|||
---|---|---|---|
#18+
Sniff-Kadabra, Код: plaintext 1. 2. 3.
Через sqlite3 никакой сложности не наблюдается. Использует она туже библиотеку, т.ч. на API сваливать не надо. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Значит либо что-то со sprintf, либо что-то еще... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 18:26 |
|
SQLite и DBL_MAX, значение по умолчанию и не только
|
|||
---|---|---|---|
#18+
И, кстати, данное число - еще не предел для REAL. Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 18:29 |
|
SQLite и DBL_MAX, значение по умолчанию и не только
|
|||
---|---|---|---|
#18+
MBG , мб, я совсем косой, но там нет ни слова о том, что в запросе create table ... невозможно использовать байнды. Insert, Replace, Delete, Select - все можно, в where-стэйтментах, итд - можно, а в create table нельзя. если не сложно - ткните пальцем White Owl , If the declared type for a column contains any of the strings "REAL", "FLOA", or "DOUB" then the column has REAL affinity., и, как я уже приводил, REAL. The value is a floating point value, stored as an 8-byte IEEE floating point number чудесно, не правда ли? RXL , премного благодарен за тест, я на консольную управлялку забил сразу и никогда не пользовал. забавно. с sprintf проблем нет, в строке досимвольно 1.7976931348623158e+308. более того, с числом 1.7976931348623150e+308 (последний нуль) проблем также не наблюдается, что, собственно, меня и озадачило. попробую поиграть с версией компилятора, хренота была под шестой студией (mcvs 6.0). ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 21:09 |
|
SQLite и DBL_MAX, значение по умолчанию и не только
|
|||
---|---|---|---|
#18+
Sniff-Kadabra MBG , мб, я совсем косой, но там нет ни слова о том, что в запросе create table ... невозможно использовать байнды. Insert, Replace, Delete, Select - все можно, в where-стэйтментах, итд - можно, а в create table нельзя. если не сложно - ткните пальцемОперация привязки может работать только где есть к чему привязываться. Если ты найдешь параметры у create table - ты сможешь использовать sqlite3_bind() на этом запросе. Sniff-Kadabra White Owl , If the declared type for a column contains any of the strings "REAL", "FLOA", or "DOUB" then the column has REAL affinity., и, как я уже приводил, REAL. The value is a floating point value, stored as an 8-byte IEEE floating point number чудесно, не правда ли?Ну и? 1) Где ты здесь видишь SQLITE_FLOAT тип данных? 2) column affinity и column type это очень разные вещи. Мало-ли какой там тип данных заявлен, главное что ты посылаешь а судя по остальным постам этого топика у тебя явная проблема со sprintf, а значит посылаешь ты в базу, хранишь в ней и читаешь из нее очень даже разные значения. Кстати, обрати внимание что максимальное реальное число может быть разной на разных платформах. Это зависит в первую очередь от разрядности процессора. А сама константа DBL_MAX не упоминается в стандарте языка и может быть объявлена по разному в разных компиляторах/библиотеках. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 22:07 |
|
SQLite и DBL_MAX, значение по умолчанию и не только
|
|||
---|---|---|---|
#18+
вести с полей. RXL , командный shell у меня ведет себя совершенно также ( в смысле, с ошибкой, а не как у вас) - значение DBL_MAX преобразуется на чтении в inf. более того, при определенном запросе shell с легкостью вылетает (корень зла в библиотеке, под студей тоже самое), ниже опишу) White Owl , по пунктам: 1) а судя по остальным постам этого топика у тебя явная проблема со sprintf, я, есть вероятность, не совсем дибил, в строке досимвольно DBL_MAX, о каких проблемах с sprintf может идти речь? вероятнее, проблема в sqlite, при внутренних преобразованиях к типу 2) Мало-ли какой там тип данных заявлен, главное что ты посылаешь заявлено - SQLITE_FLOAT, через байнд запись проходит совершенно успешно, отправляю double, получаю тоже double. наверное, если бы был заявлен текст в той или иной форме, то проблемы бы не возникло, правда? все равно, что хранить "100e+1000" или "бармалей-чемпион". 1.#inf в случае не флоата получить было бы проблематично. 3) Операция привязки может работать только где есть к чему привязываться. Если ты найдешь параметры у create table - ты сможешь использовать sqlite3_bind() на этом запросе. sqlite 3.7.2 или 3.7.8 http://sqlite.org/syntaxdiagrams.html#column-constraint картинка, на ней стрелочка->DEFAULT->signed number либо literal value либо expr в скобочках. Вон, товарищ мне тут про экспрешшон кидал. это не место, куда надо привязываться? вот тут, собственно, словил ошибку в лайте: запросы: create table t1(one int default 100); insert into t1 default values; - приводят к появлению в базе значения 100, а запросы: create table t2(one int default (?)); insert into t2 default values; - приводят к падению базы вместе с приложением, её использующем попробуйте, а? мб, у меня только так всё плохо ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2011, 13:29 |
|
SQLite и DBL_MAX, значение по умолчанию и не только
|
|||
---|---|---|---|
#18+
не дебил, да, самофикс ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2011, 13:30 |
|
SQLite и DBL_MAX, значение по умолчанию и не только
|
|||
---|---|---|---|
#18+
Sniff-Kadabra, CREATE TABLE - это DDL-запрос (а DCL в эскулайт вообще не реализован за ненадобностью). Часто SQL используют как синоним DML. И все хост-параметры как раз в DML используются, что в эскулайт, что в постгресе и т.п. Почему и зачем - достаточно очевидно, но опять же, это не SQLite-specific question. Далее, первое же предложение на странице http://www.sqlite.org/c3ref/bind_blob.html гласит In the SQL statement text input to sqlite3_prepare_v2() and its variants, literals may be replaced by a parameter... literals это значения и identifiers - имена таблиц, полей,.. Как видим, имена таблиц/функций и проч. не могут биндиться как параметры. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2011, 17:29 |
|
SQLite и DBL_MAX, значение по умолчанию и не только
|
|||
---|---|---|---|
#18+
Sniff-Kadabra, Продолжаешь злостно генерировать шум. Число с плавающей точкой - может представляться по-разному, выше я уже писал об этом. Зависит это от платформы и выполняемых над числом преобразований. При смене ОС/платформы флоат-значения будут отличаться. И sprintf и проч. функции могут возвращать разные результаты. Как пример под дебианом на х86: Код: plaintext 1. 2. 3. 4.
В обоих случаях получаем не то, что указываем, хотя переполнение только в одном случае! Никак тебе не удастся использовать значение "максимальный float", сама идея говорит лишь о полнейшем непонимании, как работает десятичная арифметика на двоичном коде. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2011, 17:40 |
|
SQLite и DBL_MAX, значение по умолчанию и не только
|
|||
---|---|---|---|
#18+
Шум? кто бы говорил. literals это значения и identifiers - имена таблиц, полей,.. Как видим, имена таблиц/функций и проч. не могут биндиться как параметры. значение по умолчанию - не имя таблицы или функции. я уже привел место в create-запросе, column-constraint, где вполне себе указано expression. полнейшее непонимание десятичной арифметики, да, меня мама учила до трех считать. sqlite вполне возвращает точное значение в случае использования bind. Через строку - нет, притом, что отправляемая строка точна, как курс на нептун. sscanf из строки тоже легко вытаскивает DBL_MAX, так что тут проблема должна быть в лайте ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2011, 12:20 |
|
|
start [/forum/topic.php?fid=54&gotonew=1&tid=2009111]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
88ms |
get topic data: |
8ms |
get first new msg: |
8ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 197ms |
0 / 0 |