xdmp: eval возвращает разные результаты для разных версий ML - PullRequest
0 голосов
/ 21 января 2019

В версии ML 9.0-8 выражение xdmp:eval("(3298534883328) div 1024 div 1024 div 1024 ") возвращает 0. Однако в ML 9.0-7 это же выражение возвращает 3072.

Аналогично, в выражении версии ML 9.0-8 xdmp:eval("(3298534883328) div 1024 ") возвращает 322122382, но в версии ML 9.0-7 то же выражение возвращает 3221225472

Почему разница 3072 с разными версиями?

1 Ответ

0 голосов
/ 22 января 2019

Похоже, что xs:decimal деление возвращает неверные результаты.Это чрезвычайно большое число, поэтому я предполагаю, что оно является результатом какого-то переполнения.

Каждое из следующих выражений дает значение xs:decimal 322122382.272474584 в более поздних версиях MarkLogic, вместо этого3221225472, который возвращается в более ранних версиях.

3298534883328 div 1024 ,
xs:integer(3298534883328) div 1024,
xs:decimal(3298534883328) div 1024,
xs:long(3298534883328) div 1024  

В качестве обходного пути вы можете принудительно рассчитать ожидаемое значение, явно оценив число левой или правой руки как xs:doubleили xs:float с помощью fn: number () , xs:numeric(), xs:double() или xs:float().

Каждый из следующихвозвращает ожидаемый ответ 3072:

fn:number(3298534883328) div 1024 div 1024 div 1024,
xs:numeric(3298534883328) div 1024 div 1024 div 1024,
xs:double(3298534883328) div 1024 div 1024 div 1024,
xs:float(3298534883328) div 1024 div 1024 div 1024,

3298534883328 div fn:number(1024) div 1024 div 1024,
3298534883328 div xs:numeric(1024) div 1024 div 1024,
3298534883328 div xs:double(1024) div 1024 div 1024,
3298534883328 div xs:float(1024) div 1024 div 1024
...