Author | Message |
---|
blackbird Зрелый участник форума
Joined: 02 Oct 2009 Posts: 28
| Posted: 31.10.2009 23:53 | |
| подключил к программе SQLite в виде амальгамации, скомпилировал. К эмуляторе всё ок, на книжке ведёт себе очень странно, например сортирует ORDER BY в обратном порядке. И не записывает в базу, такое ощущение, что не флашит буфер, т.е. после нексольких успешных вызовов типа "update table set bla-bla-bla" видны последствия только первого. хотя перед выходом делаю честный sqlite3_close(). Я еще не вполне понял механику возникновения упомянутых проблем, но может какой-то тоже пробовал SQLite с аналогичными проблемами и знает простой ответ? |
|
| |
blackbird Зрелый участник форума
Joined: 02 Oct 2009 Posts: 28
| Posted: 02.11.2009 01:03 | |
| Итого, простая база:
Code: | CREATE TABLE cards ( text TEXT NOT NULL, due FLOAT NOT NULL ); INSERT INTO cards VALUES('second',1255355329.671); INSERT INTO cards VALUES('first', 1255355260.546);
|
в ответ на запрос "select * from cards order by due" выдаёт в эмуляторе и в любой другой среде на десктопе
Code: | text = first due = 1255355260.546
text = second due = 1255355329.671 | , на книжке -
Code: | text = second due = -3.34648431592573e+233
text = first due = -1.93784766618264e+150
|
пример вызывающей программы http://dumpz.org/13898/ |
|
| |
Finom1 Член клуба The eBook
Joined: 08 May 2008 Posts: 1855
Location: Одесса
| Posted: 02.11.2009 02:22 | |
| Может я что-то не понимаю, но после order by due можно указать порядок сдедования desc или asc.blackbird wrote: | в виде амальгамации |
Что это? |
|
| |
blackbird Зрелый участник форума
Joined: 02 Oct 2009 Posts: 28
| Posted: 02.11.2009 13:11 | |
| FINoM wrote: | Может я что-то не понимаю, но после order by due можно указать порядок сдедования desc или asc. |
Да, можно указать, но по умолчанию asc. В любом случае добавления явного указания направления сортировки в запрос ничего не изменило.
FINoM wrote: | blackbird wrote: | в виде амальгамации |
Что это? |
Это когда все файлы собраны в обин большой инклуд, который просто подключается к проекту и компилируется вместе с ним. По крайней мере так это называют сами SQLite-овцы, самый, в общем, кроссплатформенный вариант. |
|
| |
a_lone Член клуба The eBook
Joined: 16 Sep 2004 Posts: 1724
| Posted: 02.11.2009 17:11 | |
| blackbird по выборке похоже, что order by игнорируется, или сортирует по какому-то другому due попробуйте отсортировать по text asc & desc, работает ли так, а кроме того, избегайте таких названий полей, они могут значить нечто другое, или подвязывайте к алиасам (кто знает, что в данной инкарнации базы данных значит due) _________________ Palm T|X -> V3Ext -> Kindle 3 3G -> Sony PRS-650BC -> Nook Touch -> KPW -> Kindle Oasis 2 |
|
| |
blackbird Зрелый участник форума
Joined: 02 Oct 2009 Posts: 28
| Posted: 02.11.2009 18:01 | |
| a_lone wrote: | blackbird по выборке похоже, что order by игнорируется, или сортирует по какому-то другому due попробуйте отсортировать по text asc & desc, работает ли так, а кроме того, избегайте таких названий полей, они могут значить нечто другое, или подвязывайте к алиасам (кто знает, что в данной инкарнации базы данных значит due) |
По какому, пардон, другому due? в таблице всего две строки и два столбца. Один с текстом, другой с вещественными числами, трудно представить более прозрачный пример. Не называть же их SAMPLE_COLUMN_OF_BIG_FLOATS Сортировка по тексту работает, только непонятно чем это помогает. В принципе видно, что проблема с обработкой больших чисел - sqlite возвращает все значения select-a в виде строк, и в них, как видно на примере выше - числа уже исковерканы. Какой уж тут order by |
|
| |
a_lone Член клуба The eBook
Joined: 16 Sep 2004 Posts: 1724
| Posted: 03.11.2009 11:36 | |
| blackbird wrote: | По какому, пардон, другому due? в таблице всего две строки и два столбца. Один с текстом, другой с вещественными числами, трудно представить более прозрачный пример. Не называть же их SAMPLE_COLUMN_OF_BIG_FLOATS Сортировка по тексту работает, только непонятно чем это помогает. В принципе видно, что проблема с обработкой больших чисел - sqlite возвращает все значения select-a в виде строк, и в них, как видно на примере выше - числа уже исковерканы. Какой уж тут order by |
я имел в виду понятие "зарезервированные слова". Используйте тип данных Numeric и будет вам счастье
Posted after 2 minutes 22 seconds:
Если, конечно, он есть в SQLLite. В Sybase это помогло решить проблему
Posted after 10 minutes 10 seconds:
Почитал доку SQLLite - непонятно. Может, стоит использовать DOUBLE - это двойной FLOAT, или REAL - если только он 8-байтовый. В любом случае у Вас банальное переполнение данных |
|
| |
blackbird Зрелый участник форума
Joined: 02 Oct 2009 Posts: 28
| Posted: 03.11.2009 12:01 | |
| Да, в SQLite есть NUMERIC, но, к великому сожалению, базы генерирует не моё приложение, я делаю только вьювер для книжки.
И да, похоже на переполнение, но очень бы хотелось понять какой именно нюанс компиляции/ в каком месте библиотеки приводит к таким печальным последствиям, чтобы написать либо авторам базы, либо в SQLite, либо, в идеале - исправить самостоятельно.
Ибо писать "ребята, тут ваша библиотека че-то не работает у меня на книжке" будет менее продуктивно
Posted after 7 minutes 38 seconds:
кстати сейчас проверю с numeric этот же пример
Posted after 10 minutes 54 seconds:
вообще интересно: с NUMERIC сортирует (если это не случайность), но данные возвращает также испорченные. |
|
| |
a_lone Член клуба The eBook
Joined: 16 Sep 2004 Posts: 1724
| Posted: 03.11.2009 12:59 | |
| А DOUBLE здесь нет? Говоря про NUMERIC, Я имел в виду тип данных NUMERIC(v, n), где v - кол-во знаков до запятой, n - после. _________________ Palm T|X -> V3Ext -> Kindle 3 3G -> Sony PRS-650BC -> Nook Touch -> KPW -> Kindle Oasis 2 |
|
| |
blackbird Зрелый участник форума
Joined: 02 Oct 2009 Posts: 28
| Posted: 03.11.2009 20:07 | |
| и DOUBLE тут есть, только толку от него нет. Прежде всего я не могу формат базы менять, а вообще попробовал и дабл - всё равно значение портится. Размер интов/флоатов на книжке такой же, странно, что один и тот же код ведёт себя по-разному. Может быть они используют какой-то библиотечный вызов для конвертации строк во флоаты, который как раз и сбоит на длинных числах :-\
Posted after 1 minute 18 seconds:
собственно double\float представляют разницу в точности, показатель-то должен одинаковый быть...
Posted after 10 minutes 56 seconds:
точнее будет сказать, что он понимает double в запросах, а в документации написано, что есть один тип real, но он умеет записывать данные в виде текста, если видет, что точность теряется. В любом случае проблема в том, как их оттуда прочитать.
Posted after 47 minutes 4 seconds:
в общем ни numeric ни float ни double ни real не сортируются и не возвращают данные. Там где выше я написал, что numeric поля отсортировались - это неверно. из числа 1000000000.1 получается 1.78e-308. ох...
Posted after 8 minutes 45 seconds:
Ха-ха, а я сделал числа поменьше - и он всё равно не работает. Поменьше - это типа 100.1, т.е. проблема не с переполнением |
|
| |
RedUser Член клуба The eBook
Joined: 22 Jan 2009 Posts: 569
Location: Мурманск
| Posted: 03.11.2009 21:18 | |
| blackbird wrote: | ...... странно, что один и тот же код ведёт себя по-разному. Может быть они используют какой-то библиотечный вызов для конвертации строк во флоаты, который как раз и сбоит на длинных числах ... |
Хе-хе, конкретно по теме ничего сказать не могу, но я тут намеревался сделать типа упрощенный библиотекарь, так в эмуляторе все идет на ура. Раскладывает книжки по жанрам и так, как мне надо еще... А на книжке тот же код вываливается. На обработке определенной книги (может и дальше так, пока одну нашел). Рядом сотни таких же - нормально проходят. А эта.... Уже всю ее вдоль и поперек изучил - ничего особенного. Вобщем забросил это дело...
А по теме. Не мое дело, конечно, но может проще сделать внешний конвертор? Из базы во что-то понимаемое книгой? _________________ PocketBook 301+ ‹14.2› | PocketBook 360 ‹14.2› Ищется работа. Мурманск |
|
| |
blackbird Зрелый участник форума
Joined: 02 Oct 2009 Posts: 28
| Posted: 03.11.2009 21:25 | |
| еще пара несложных экспериментов показала, что портятся те числа, у которых есть что-то отличное от нуля после десятичной точки: 100 -ok, 100.0 - ок, 100.1 - fail
Posted after 4 minutes 40 seconds:
RedUser wrote: | А по теме. Не мое дело, конечно, но может проще сделать внешний конвертор? Из базы во что-то понимаемое книгой? |
ох, ну это самый крайний вариант, но пользователю будет ощутимо менее удобно. Обидно то, что на эмуляторе всё (по крайней мере в черновом варианте) уже работает. Решить проблему с SQLite - и можно было бы предоставлять на суд общественности. |
|
| |
blackbird Зрелый участник форума
Joined: 02 Oct 2009 Posts: 28
| Posted: 04.11.2009 21:52 | |
| из SQLite-а пишутQuote: | I'm guessing that your hardward does not implement IEEE 754 floating point correctly. We've seen that sort of thing before, especially with GCC. There are some options to GCC (which escape my memory right now) that can force it to use strict IEEE 754 floating point rather than its preferred, speedier but non-standard alternative. |
поскольку базу менять не вариант, осталось найти эту волшебную опцию
Posted after 16 minutes 56 seconds:
если это -msoft-float - то на книжке нет libfloat :-\ |
|
| |
ni4 Недавний участник форума
Joined: 31 Aug 2009 Posts: 15
| Posted: 09.11.2009 01:08 | |
| А зачем собственно привязка к float? Поставьте уже int, если это вызывает такие проблемы. |
|
| |
a_lone Член клуба The eBook
Joined: 16 Sep 2004 Posts: 1724
| Posted: 09.11.2009 12:25 | |
| ni4 автор же ясно написал "..поскольку базу менять не вариант.." _________________ Palm T|X -> V3Ext -> Kindle 3 3G -> Sony PRS-650BC -> Nook Touch -> KPW -> Kindle Oasis 2 |
|
| |
t.t Член клуба The eBook
Joined: 20 Oct 2008 Posts: 431
Location: Киев
| Posted: 10.11.2009 11:44 | |
| В ядре включён умолчательный эмулятор FPU. С float и double никаких проблем не было. От DmitryZ поступило предложение попробовать опцию -static-libgcc. |
|
| |
blackbird Зрелый участник форума
Joined: 02 Oct 2009 Posts: 28
| Posted: 10.11.2009 17:28 | |
| t.t wrote: | В ядре включён умолчательный эмулятор FPU. С float и double никаких проблем не было. От DmitryZ поступило предложение попробовать опцию -static-libgcc. |
c -static-libgcc тоже не работает И только что вышедший sqlite 3.6.20 также не принёс облегчения. Где-то видел тест на совместимость с этим самым стандартом, попробую найти еще раз и запустить на книжке. |
|
| |
Ian Gore Новенький участник форума
Joined: 15 Dec 2009 Posts: 1
| Posted: 15.12.2009 15:38 | |
| Не знаю, актуальна ли ещё тема для автора топика, но меня проблема заинтересовала, и я кое-что нашел. А так как реального устройства у меня нет, то сам проверить мысль не могу.
В общем так - попробуйте поставить следующий define в своем примере перед sqlite
Code: | #define SQLITE_MIXED_ENDIAN_64BIT_FLOAT #include "libs/sqlite3.h"
|
в sqlite3.с про этот define написано, что его надо использовать, если в числе используется другой порядок байтов (в вашем примере такое предположение напрашивается). Сначала грешили на архитектуру ARM, но в поздних комментариях указывается на ядро Linux, которое эмулирует 48 битное кодирование флоата на некоторых процессорах с 32 мантиссой.
Как говорится - возможно, это наш случай. Попробуйте. |
|
| |
blackbird Зрелый участник форума
Joined: 02 Oct 2009 Posts: 28
| Posted: 16.12.2009 01:25 | |
| Code: | #define SQLITE_MIXED_ENDIAN_64BIT_FLOAT #include "libs/sqlite3.h"
|
не пойдёт, если sqlite.c компилируется отдельно, но можно передать в gcc опцию -DSQLITE_MIXED_ENDIAN_64BIT_FLOAT - и да, ОНО РАБОТАЕТ!!!!!!! спасибо огромное, я уже было отчаялся
Posted after 22 minutes 42 seconds:
на самом деле у меня тоже нет устройства, я надеюсь что я правильно написал тест и человек его правильно понял.... и осталось разобраться с почему таки часть изменения не сохраняется :-\ |
|
| |
blackbird Зрелый участник форума
Joined: 02 Oct 2009 Posts: 28
| Posted: 17.12.2009 01:39 | |
| так, с буферизацией - мой косяк был. с вещественными числами - всё ок,
Code: | -DSQLITE_MIXED_ENDIAN_64BIT_FLOAT | помогает проблему можно считать решенной спасибо еще раз! |
|
| |