Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Почему так сортируются строки? / 25 сообщений из 29, страница 1 из 2
15.12.2015, 13:06
    #39128410
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
Коллеги, буду благодарен, если кто-то сможет поделиться соображениями по данному поводу.

Дано: Cache 2012.2.5 - 2015.1.2.

Локаль: ^%SYS("LOCALE","CURRENT")="ruw8"
Таблица сортировки: Cyrillic2 или Cache standard (не важно).

Вопрос: Есть ли разумное объяснение такой сортировке? kill b
 set a=1E30,b(+a)=1,b(+a_"1")=3,b(+a_"1a")="3a"
 set a=3E30,b(+a)=2,b(+a_"1")=4,b(+a_"1a")="4a"
 set b($c(2))="??"
 zwrite b

Код: plaintext
1.
2.
3.
4.
5.
6.
b(1000000000000000000000000000000)=1
b(3000000000000000000000000000000)=2
b("10000000000000000000000000000001")=3
b("30000000000000000000000000000001")=4
b($c(2))="??"
b("10000000000000000000000000000001a")="3a"
b("30000000000000000000000000000001a")="4a"

При этом стандартная проверка локали: kill b for i=0:1:127 s b($c(i))=iпроходит нормально: сначала числа, потом строки в порядке возрастания кодов ASCII.
...
Рейтинг: 0 / 0
15.12.2015, 13:17
    #39128431
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
Alexey Maslov
Код: plaintext
1.
b("10000000000000000000000000000001")=3
b("30000000000000000000000000000001")=4

очевидно, что эти узлы сортируются как числовые, несмотря на то что отображаются как строки
когда они точно становятся строками, тогда уже точно сортируются нормально

но это уже вопрос к IS, корректно ли что строки которые только с числами сортируются как числа, а не как строки

у меня так же сортируется
Cache for Windows (x86-64) 2016.1 (Build 596U) Mon Nov 9 2015 21:12:55 EST
...
Рейтинг: 0 / 0
15.12.2015, 13:31
    #39128467
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
Alexey Maslov,
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
USER>kill b
 
USER>set b(+a_"1")=3,b(+a_"1a")="3a"
 
USER>set b(+a_"1")=4,b(+a_"1a")="4a"
 
USER>set b($c(2))="??"
 
USER>zwrite b
b("30000000000000000000000000000001")=4
b($c(2))="??"
b("30000000000000000000000000000001a")="4a"
 
USER>w $zv
Cache for Windows (x86-64) 2008.2 (Build 506) Thu Sep 4 2008 11:07:26 EDT

У меня с записями маркированными как 3 и 3а что-то куда-то вообще уехало...
...
Рейтинг: 0 / 0
15.12.2015, 13:31
    #39128469
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
DAiMor,
Вот и мне так показалось. Кстати, результат такой же, даже если подобное "псевдочисло" вызывает числовое переполнение, например: USER>s j=310,n=$tr($j("",j)," ",1) set b(n)=j zw b
b(1000000000000000000000000000000)=1
b(3000000000000000000000000000000)=2
b("10000000000000000000000000000001")=3
b("30000000000000000000000000000001")=4
b("11111111111111111111111111111111111111...111")=310
b($c(2))="c2"
b("10000000000000000000000000000001a")="3a"
b("30000000000000000000000000000001a")="4a"

USER>w n=+n

W n=+n
^
<MAXNUMBER>
...
Рейтинг: 0 / 0
15.12.2015, 13:32
    #39128470
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
сорри, только заметил что в тесте не менял a
...
Рейтинг: 0 / 0
15.12.2015, 13:36
    #39128477
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
ну я,

"а что нам скажет товарищ MiniM"?

Проще выполнять однострочник:k b s a=1E30,b(+a)=1,b(+a_"1")=3,b(+a_"1a")="3a",a=3E30,b(+a)=2,b(+a_"1")=4,b(+a_"1a")="4a",b($c(2))="c2" zwrite b
...
Рейтинг: 0 / 0
15.12.2015, 13:47
    #39128502
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
Код: plaintext
1.
2.
3.
4.
5.
6.
b(1E+30)=1
b(3E+30)=2
b("&#9787;")="c2"
b("1E+301")=3
b("1E+301a")="3a"
b("3E+301")=4
b("3E+301a")="4a"
...
Рейтинг: 0 / 0
15.12.2015, 13:49
    #39128505
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
b("&#9787;")="c2"Тут в индексе в досовой кодировке рожица должна быть.
...
Рейтинг: 0 / 0
15.12.2015, 13:58
    #39128522
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
ну я,

спасибо, в MiniM сортируется, как и ожидается, хотя, похоже, есть (другая) ошибка. Согласно Стандарту, унарный плюс (как и любая арифметическая операция) должен привести число к каноническому виду, e.g.
Код: plaintext
1.
2.
USER>set a="1E30" write +a,!,+a_"1"
1000000000000000000000000000000
10000000000000000000000000000001
...
Рейтинг: 0 / 0
15.12.2015, 14:01
    #39128526
Александр Коблов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
Это наверное не объяснение, но в документации есть абзац про порядок сортировки чисел и строк: Numeric and String-Valued Subscripts

Обратите внимание, что порядок сортировки строк не обязательно совпадает с порядком кодов символов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
USER>set ^a("текст")=1
 
USER>set ^a("ТЕКСТ")=1

USER>write ##class(%Collate).LogicalToDisplay(##class(%GlobalEdit).Open("a").Collation)
Cyrillic2

USER>zwrite ^a
^a("текст")=1
^a("ТЕКСТ")=1
 
USER>write $Ascii("т")
242
USER>write $Ascii("Т")
210
...
Рейтинг: 0 / 0
15.12.2015, 14:16
    #39128560
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
Александр Коблов,

спасибо, об этом знаем :) не случайно ведь привёл: При этом стандартная проверка локали:
kill b for i=0:1:127 s b($c(i))=i 
проходит нормально: сначала числа, потом строки в порядке возрастания кодов ASCII.К тому же в пределах первой половины таблицы ASCII никаких чудес быть не должно (согласно Стандарту языка ISO/M).

В качестве попытки объяснения можно было бы привести результат выполнения $isvalidnum, однако: set j=310,n=$tr($j("",j)," ",1)
 for i="10000000000000000000000000000001","30000000000000000000000000000001",n { 
  w $isvalidnum(i)_" $length(i)="_$l(i)_" i="_i,! ;_" i=+i:"_(i=+i),!
}

Код: plaintext
1.
2.
1 $length(i)=32 i=10000000000000000000000000000001
1 $length(i)=32 i=30000000000000000000000000000001
0 $length(i)=310 i=111...111111111111111111111111111111
при этом n, как было показано ранее, тоже сортируется в индексе как число.
...
Рейтинг: 0 / 0
15.12.2015, 15:38
    #39128685
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
Коллеги,
понимаю, что, наверное, уже надоел, и, конечно, обращусь в WRC, но может кто-нибудь для статистики выполнить пресловутый однострочник в MSM?
Я почти уверен в результате, но всё же... k b s a=1E30,b(+a)=1,b(+a_"1")=3,b(+a_"1a")="3a",a=3E30,b(+a)=2,b(+a_"1")=4,b(+a_"1a")="4a",b($c(2))="c2" zwrite b
...
Рейтинг: 0 / 0
15.12.2015, 15:41
    #39128690
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
Alexey Maslov,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
MSM for Windows NT, Version 4.4.1 (RC-1)  Line #1  UCI: ******* Job #3
>k b s a=1E30,b(+a)=1,b(+a_"1")=3,b(+a_"1a")="3a",a=3E30,b(+a)=2,b(+a_"1")=4,b(+a_"1a")="4a",b($c(2))="c2" zwrite b
b(1000000000000000000000000000000)=1
b(3000000000000000000000000000000)=2
b("")="c2"
b("10000000000000000000000000000001")=3
b("10000000000000000000000000000001a")="3a"
b("30000000000000000000000000000001")=4
b("30000000000000000000000000000001a")="4a"
...
Рейтинг: 0 / 0
15.12.2015, 15:44
    #39128699
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
Уже подзабыл, дружит ли MSM с управляющими в индексах, если нет, то последнее присваивание (b($c(2))="c2") можно смело выкинуть, т.к. $c(2) в Cache сортируется правильно и не влияет на суть примера.
...
Рейтинг: 0 / 0
15.12.2015, 15:49
    #39128710
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
ну я, ещё раз спасибо.

Похоже, у основных "M-соседей" сортируется правильно, бяка только в Cache. Не имею доступа к экзотике типа M21 и MumpsV1, но это уже не столь важно.
...
Рейтинг: 0 / 0
15.12.2015, 16:01
    #39128731
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
Alexey Maslov,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
GTM>k b s a=1E30,b(+a)=1,b(+a_"1")=3,b(+a_"1a")="3a",a=3E30,b(+a)=2,b(+a_"1")=4,b(+a_"1a")="4a",b($c(2))="c2" zwrite b
b(1000000000000000000000000000000)=1
b(3000000000000000000000000000000)=2
b($C(2))="c2"
b("10000000000000000000000000000001")=3
b("10000000000000000000000000000001a")="3a"
b("30000000000000000000000000000001")=4
b("30000000000000000000000000000001a")="4a"

GTM>
...
Рейтинг: 0 / 0
15.12.2015, 16:44
    #39128823
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
Valeriu,

спасибо.
...
Рейтинг: 0 / 0
15.12.2015, 17:10
    #39128869
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
Alexey MaslovВопрос: Есть ли разумное объяснение такой сортировке?Пока всё согласно документации:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
k b
s b(12345678901234567891)=1
s b("12345678901234567891")=2
s b("11345678901234567891")=3
zw b
w !
k b
s b(012345678901234567891)=1
s b("012345678901234567891")=2
s b("011345678901234567891")=3
zw b

b("11345678901234567891")=3
b(12345678901234567890)=1
b("12345678901234567891")=2
 
b(12345678901234567890)=1
b("011345678901234567891")=3
b("012345678901234567891")=2
Именно поэтому "1111111111111111...11111111111111111" сортируется как число, а не строка, хотя это строка.
Но достаточно жёстко указать Caché воспринимать её как строку, как она уже сортируется как строка, например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
s b($c(0))=$c(0)
s j=110,b($tr($j("",j)," ",1))=j
s j=110,b($tr($j("",j)," ","0"))=j
zw b

b("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")=110
b($c(0))=$c(0)
b("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")=110

s b($c(0))=$c(0)
s j=110,b("0"_$tr($j("",j-1)," ",1))=j ; указываем явно строчную сортировку
s j=110,b($tr($j("",j)," ","0"))=j
zw b

b($c(0))=$c(0)
b("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")=110
b("01111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")=110
...
Рейтинг: 0 / 0
15.12.2015, 18:04
    #39128942
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
servit,

у вас другой код, и другие результаты. Свой пример я ещё немного доработал:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
k b s a=1E30,b(+a)=1,b(+a_"11")=11,b(+a_"111")=111,b(+a_"1a")="3a",a=3E30,b(+a)=3,b(+a_"33")=33,b(+a_"333")=333,b(+a_"1a")="4a" zwrite b
b(1000000000000000000000000000000)=1
b(3000000000000000000000000000000)=3
b("100000000000000000000000000000011")=11
b("300000000000000000000000000000033")=33
b("1000000000000000000000000000000111")=111
b("3000000000000000000000000000000333")=333
b("10000000000000000000000000000001a")="3a"
b("30000000000000000000000000000001a")="4a"
Видите, что получается? По документации должно быть 2 интервала сортировки:
1) числа - сортируются как числа
2) не числа - сортируются алфавитно.

А мы видим три:
1) числа - сортируются как числа (1-3)
1*) "псевдочисла" - сортируются как числа (11-333)
2) не числа - сортируются алфавитно (3a-4a).

(Временно) прекращаю обсуждение, т.к. открыл проблему в WRC. Если ISC не будет возражать, отпишусь о результатах.
...
Рейтинг: 0 / 0
15.12.2015, 18:36
    #39129003
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
servit,

напоследок приведу модифицированный пример без комментариев.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
w ! k b set j=310,n=$tr($j("",j)," ",1),b(n)="Over1",n=$tr($j("",j)," ",2),b(n)="Over2",n=$tr($j("",j+1)," ",1),b(n)="Over11" s a=1E30,b(+a)=1,b(+a_"11")=11,b(+a_"111")=111,b(+a_"1a")="3a",a=3E30,b(+a)=3,b(+a_"33")=33,b(+a_"333")=333,b(+a_"1a")="4a" s x="" f { s x=$o(b(x)) q:x=""  w $j(b(x),10),"  isvalidnum? ",$isvalidnum(x) try {w "  x=+x? ",x=+x,"  x-1+1=x? ",x-1+1=x,!} catch { w $ze,! }}

         1  isvalidnum? 1  x=+x? 1  x-1+1=x? 1
         3  isvalidnum? 1  x=+x? 1  x-1+1=x? 1
        11  isvalidnum? 1  x=+x? 0  x-1+1=x? 0
        33  isvalidnum? 1  x=+x? 0  x-1+1=x? 0
       111  isvalidnum? 1  x=+x? 0  x-1+1=x? 0
       333  isvalidnum? 1  x=+x? 0  x-1+1=x? 0
     Over1  isvalidnum? 0  x=+x? <MAXNUMBER>
     Over2  isvalidnum? 0  x=+x? <MAXNUMBER>
    Over11  isvalidnum? 0  x=+x? <MAXNUMBER>
        3a  isvalidnum? 0  x=+x? 0  x-1+1=x? 0
        4a  isvalidnum? 0  x=+x? 0  x-1+1=x? 0
...
Рейтинг: 0 / 0
15.12.2015, 21:51
    #39129199
eduard93
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
Alexey Maslov, у вас числа больше максимально возможного целого числа в Cache 2^63-1 = 9223372036854775807.
...
Рейтинг: 0 / 0
16.12.2015, 08:05
    #39129330
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
eduard93, правильно. Тогда вопрос, почему Cache считает их числами:
Код: plaintext
1.
2.
3.
PERF>w $isvalidnum(9223372036854775808)
1
PERF>w $isvalidnum(19223372036854775808)
1
если произошёл выход за рамки диапазона чисел?
...
Рейтинг: 0 / 0
16.12.2015, 08:24
    #39129337
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
Возможно, дело в этом: Cache ObjectScript Reference
$DOUBLENote:
A Cache numeric string literal that exceeds the min/max range supported by Cache floating point data types (for example, “1E128”) is automatically converted to an IEEE double-precision floating point number. This conversion is only performed on numeric literals; it is not performed on the results of mathematical operations. This automatic conversion can be controlled on a per-process basis using the TruncateOverflow() method of the %SYSTEM.Process class. The system-wide default behavior can be established by setting the TruncateOverflow property of the Config.Miscellaneous class.Это объясняет поведение $isvalidnum, но не оправдывает сортировку, которая должна подчиняться не внутренней функции, а Стандарту, который в этой важной части, как мы вчера увидели, неплохо соблюдается в других М-системах.
...
Рейтинг: 0 / 0
16.12.2015, 12:26
    #39129614
Timur Safin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
Alexey Maslov,

Какому такому стандарту? :)

(Он был про другой язык, он не активен, он сообществу не нужен и не поддерживается)
...
Рейтинг: 0 / 0
16.12.2015, 13:01
    #39129658
Alexey Maslov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему так сортируются строки?
Timur Safin,

тем не менее, в документации немало ссылок на Стандарт ISO 11756-1999 (поиск работает :). Вот, например, в тему: RoutinesWhen you create routines in Cache, you can choose the programming language for each routine. The choices are as follows:
Cache ObjectScript, which is a superset of the ISO 11756-1999 standard M programming language. If you are an M programmer, you can run your existing M applications on Cache with no change.
Timur SafinОн был про другой язык, он не активен, он сообществу не нужен и не поддерживаетсяРасскажите об этом, например, участникам этого сборища , им полезно будет узнать, что они "скорее мертвы, чем живы".

Стоит ли объяснять, зачем нужна обратная совместимость со Стандартом, кстати, весьма хорошо обеспечиваемая в Cache? Случайно найденное мною исключение лишь подтверждает правило :)
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Почему так сортируются строки? / 25 сообщений из 29, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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