powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite и DBL_MAX, значение по умолчанию и не только
19 сообщений из 19, страница 1 из 1
SQLite и DBL_MAX, значение по умолчанию и не только
    #37473556
Sniff-Kadabra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго и времени суток тоже.
Задача, в общем, такая: есть 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 ?) базочка возражает, что вопросительных знаков не хотет. Вопрос - как такое можно сделать? за идеи спасибо!
...
Рейтинг: 0 / 0
SQLite и DBL_MAX, значение по умолчанию и не только
    #37473688
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажи пожалуйста, а откуда ты взял тип данных SQLITE_FLOAT и константу DBL_MAX?
И заодно ответь: Зачем тебе такая точность? Если уж ты начал оперировать астрономическими числами, может стоит посмотреть на соответствующие библиотеки (GMP например)? А то писать такие числа в базу не велика премудрость, но что ты с ними дальше делать собираешься это загадка.
...
Рейтинг: 0 / 0
SQLite и DBL_MAX, значение по умолчанию и не только
    #37473848
Sniff-Kadabra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
отвечаю, по порядку:
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) и, вдогонку, почему при создании таблиц нельзя пользоваться байндом?
...
Рейтинг: 0 / 0
SQLite и DBL_MAX, значение по умолчанию и не только
    #37474918
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
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
...
Рейтинг: 0 / 0
SQLite и DBL_MAX, значение по умолчанию и не только
    #37475211
Sniff-Kadabra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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... .
...
Рейтинг: 0 / 0
SQLite и DBL_MAX, значение по умолчанию и не только
    #37475524
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
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. Просьба к модератору удалить нафиг этот мусорный топик.
...
Рейтинг: 0 / 0
SQLite и DBL_MAX, значение по умолчанию и не только
    #37475594
Sniff-Kadabra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сломаный детектор детектед.
во-первых, где вы увидели приведение к типу int? протрите глазки, тип - %e, а вот d - это число типа double.
Да, невозможно, согласно документации SQLite ссылочку или цитаточку можно?
...
Рейтинг: 0 / 0
SQLite и DBL_MAX, значение по умолчанию и не только
    #37475864
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
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
На диаграмме указано возможное размещение параметров биндинга.
...
Рейтинг: 0 / 0
SQLite и DBL_MAX, значение по умолчанию и не только
    #37476048
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sniff-KadabraSQLITE_FLOAT - один из пяти внутренних типов данных SQLite. http://www.sqlite.org/datatype3.html читай эту страницу внимательнее. Типа SQLITE_FLOAT не существует.
...
Рейтинг: 0 / 0
SQLite и DBL_MAX, значение по умолчанию и не только
    #37476091
RXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sniff-Kadabra,

Код: plaintext
1.
2.
3.
sqlite> SELECT  1 .7976931348623158e+ 308  "number", TYPEOF( 1 .7976931348623158e+ 308 ) "type";
number|type
 1 .79769313486232e+ 308 |real

Через sqlite3 никакой сложности не наблюдается. Использует она туже библиотеку, т.ч. на API сваливать не надо.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
-- Тест на деволтное значение
sqlite> CREATE TABLE t (rowid INTEGER NOT NULL PRIMARY KEY, n REAL NOT NULL DEFAULT  1 .7976931348623158e+ 308 );

sqlite> INSERT INTO t (rowid) VALUES ( 1 );
sqlite> INSERT INTO t (rowid, n) VALUES ( 2 ,  1 .7976931348623158e+ 308 );

sqlite> SELECT * FROM t;
rowid|n
 1 | 1 .79769313486232e+ 308 
 2 | 1 .79769313486232e+ 308 

-- Проверка на равенство.
sqlite> SELECT * FROM t t1, t t2 WHERE t1.rowid =  1  AND t2.rowid =  2  AND t1.n = t2.n;
rowid|n|rowid|n
 1 | 1 .79769313486232e+ 308 | 2 | 1 .79769313486232e+ 308 

Значит либо что-то со sprintf, либо что-то еще...
...
Рейтинг: 0 / 0
SQLite и DBL_MAX, значение по умолчанию и не только
    #37476097
RXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И, кстати, данное число - еще не предел для REAL.

Код: plaintext
1.
2.
3.
4.
5.
6.
sqlite> select  1 .7976931348623158e+ 308  + 1e291 "a";
a
 1 .79769313486232e+ 308 
sqlite> select  1 .7976931348623158e+ 308  + 1e292 "a";
a
Inf
...
Рейтинг: 0 / 0
SQLite и DBL_MAX, значение по умолчанию и не только
    #37476230
Sniff-Kadabra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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).
...
Рейтинг: 0 / 0
SQLite и DBL_MAX, значение по умолчанию и не только
    #37476278
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 не упоминается в стандарте языка и может быть объявлена по разному в разных компиляторах/библиотеках.
...
Рейтинг: 0 / 0
SQLite и DBL_MAX, значение по умолчанию и не только
    #37477085
Sniff-Kadabra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вести с полей.
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; - приводят к падению базы вместе с приложением, её использующем
попробуйте, а? мб, у меня только так всё плохо
...
Рейтинг: 0 / 0
SQLite и DBL_MAX, значение по умолчанию и не только
    #37477091
Sniff-Kadabra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не дебил, да, самофикс
...
Рейтинг: 0 / 0
SQLite и DBL_MAX, значение по умолчанию и не только
    #37477612
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
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 - имена таблиц, полей,.. Как видим, имена таблиц/функций и проч. не могут биндиться как параметры.
...
Рейтинг: 0 / 0
SQLite и DBL_MAX, значение по умолчанию и не только
    #37477635
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Sniff-Kadabra,

Продолжаешь злостно генерировать шум.

Число с плавающей точкой - может представляться по-разному, выше я уже писал об этом. Зависит это от платформы и выполняемых над числом преобразований. При смене ОС/платформы флоат-значения будут отличаться. И sprintf и проч. функции могут возвращать разные результаты. Как пример под дебианом на х86:

Код: plaintext
1.
2.
3.
4.
sqlite> select cast( 1 .797693134862316e+ 308  as real);
Inf
sqlite> select cast( 1 .797693134862315e+ 308  as real);
 1 .79769313486232e+ 308 

В обоих случаях получаем не то, что указываем, хотя переполнение только в одном случае! Никак тебе не удастся использовать значение "максимальный float", сама идея говорит лишь о полнейшем непонимании, как работает десятичная арифметика на двоичном коде.
...
Рейтинг: 0 / 0
SQLite и DBL_MAX, значение по умолчанию и не только
    #37478570
Sniff-Kadabra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шум? кто бы говорил.
literals это значения и identifiers - имена таблиц, полей,.. Как видим, имена таблиц/функций и проч. не могут биндиться как параметры.
значение по умолчанию - не имя таблицы или функции. я уже привел место в create-запросе, column-constraint, где вполне себе указано expression.

полнейшее непонимание десятичной арифметики, да, меня мама учила до трех считать.
sqlite вполне возвращает точное значение в случае использования bind. Через строку - нет, притом, что отправляемая строка точна, как курс на нептун. sscanf из строки тоже легко вытаскивает DBL_MAX, так что тут проблема должна быть в лайте
...
Рейтинг: 0 / 0
SQLite и DBL_MAX, значение по умолчанию и не только
    #37479110
RXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sniff-Kadabra,

Может все таки есть возможность не идти по скользкой дорожке, а делать как принято - через NULL или дополнительные поля?
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQLite и DBL_MAX, значение по умолчанию и не только
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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