#xpath #ieee-754
Вопрос:
Я должен знать, какое минимальное количество битов (32, 64 или 128) обычно используется в процессорах XPath при преобразовании значения в число с плавающей запятой, определенное в IEEE 754.
Язык XML XPath (XPATH) Версия 1.0
(https://www.w3.org/TR/1999/REC-xpath-19991116/)
Государства по разделу 4.4:
«Функция number преобразует свой аргумент в число следующим образом:»
- «строка, состоящая из необязательных пробелов, за которыми следует необязательный знак минус, за которым следует число, за которым следует пробел, преобразуется в число IEEE 754, которое ближе всего (в соответствии с правилом округления IEEE 754 до ближайшего) к математическому значению, представленному строкой; любая другая строка преобразуется в NaN».
Я просмотрел реализацию libxml2 (https://github.com/GNOME/libxml2/blob/22f1521122402bee88b58a463af58b5ab865dc3f/xpath.c#L9984):
double
xmlXPathStringEvalNumber(const xmlChar *str) {
const xmlChar *cur = str;
double ret;
int ok = 0;
int isneg = 0;
int exponent = 0;
int is_exponent_negative = 0;
#ifdef __GNUC__
unsigned long tmp = 0;
double temp;
#endif
if (cur == NULL) return(0);
while (IS_BLANK_CH(*cur)) cur ;
if ((*cur != '.') amp;amp; ((*cur < '0') || (*cur > '9')) amp;amp; (*cur != '-')) {
return(xmlXPathNAN);
}
if (*cur == '-') {
isneg = 1;
cur ;
}
#ifdef __GNUC__
/*
* tmp/temp is a workaround against a gcc compiler bug
* http://veillard.com/gcc.bug
*/
ret = 0;
while ((*cur >= '0') amp;amp; (*cur <= '9')) {
ret = ret * 10;
tmp = (*cur - '0');
ok = 1;
cur ;
temp = (double) tmp;
ret = ret temp;
}
#else
ret = 0;
while ((*cur >= '0') amp;amp; (*cur <= '9')) {
ret = ret * 10 (*cur - '0');
ok = 1;
cur ;
}
#endif
if (*cur == '.') {
int v, frac = 0, max;
double fraction = 0;
cur ;
if (((*cur < '0') || (*cur > '9')) amp;amp; (!ok)) {
return(xmlXPathNAN);
}
while (*cur == '0') {
frac = frac 1;
cur ;
}
max = frac MAX_FRAC;
while (((*cur >= '0') amp;amp; (*cur <= '9')) amp;amp; (frac < max)) {
v = (*cur - '0');
fraction = fraction * 10 v;
frac = frac 1;
cur ;
}
fraction /= pow(10.0, frac);
ret = ret fraction;
while ((*cur >= '0') amp;amp; (*cur <= '9'))
cur ;
}
if ((*cur == 'e') || (*cur == 'E')) {
cur ;
if (*cur == '-') {
is_exponent_negative = 1;
cur ;
} else if (*cur == ' ') {
cur ;
}
while ((*cur >= '0') amp;amp; (*cur <= '9')) {
if (exponent < 1000000)
exponent = exponent * 10 (*cur - '0');
cur ;
}
}
while (IS_BLANK_CH(*cur)) cur ;
if (*cur != 0) return(xmlXPathNAN);
if (isneg) ret = -ret;
if (is_exponent_negative) exponent = -exponent;
ret *= pow(10.0, (double)exponent);
return(ret);
}
Ясно, что эта реализация использует 64-разрядное пространство для хранения результатов, но есть и другие процессоры XPath (например, saxon: https://www.saxonica.com/) и есть шанс, что появится больше возможностей для реализации.
Программное обеспечение, над которым я в настоящее время работаю, должно поддерживать все доступные в настоящее время и все будущие реализации XPath 1.0, и некоторые вычисления зависят от этого конкретного минимального значения.
Есть ли какие-то более конкретные требования по этому вопросу, когда кто-то разрабатывает процессор XPath?
Заранее спасибо.
Комментарии:
1. Я думаю, что удвоения XPath 1.0-это 64-разрядные числа с плавающей запятой, такие же, как двойные числа Java или C# или числа JavaScript, в основном основанные на одном и том же стандарте IEEE. XPath 2 или более поздние версии не изменили этот тип чисел, вместо этого система типов была дополнена другими числовыми типами из языка XML-схемы, такими как
xs:integer
,xs:decimal
. И я не уверен, почему Saxon, реализация XPath 3.1, имеет значение, если требования ограничены XPath 1.0.2. Я обнаружил благодаря вам, что был невнимателен, когда читал спецификацию XPath 1.0: «Число представляет собой число с плавающей запятой. Число может иметь любое 64-разрядное значение формата IEEE 754 с двойной точностью [IEEE 754]», поэтому, если я прав, числа с плавающей запятой все 64-разрядные, как вы сказали. Если вы хотите ответить на этот вопрос, я бы принял это как правильный ответ. Что касается Saxon, то это программное обеспечение планирует поддерживать все реализации XPath, а не только те, которые поддерживают XPath 1.0.
Ответ №1:
Спецификация XPath 1.0 требует двойной точности (64 бита):
Число представляет собой число с плавающей запятой. Число может иметь любое значение 64-битного формата IEEE 754 с двойной точностью. Они включают специальное значение «Не-числа» (NaN), положительную и отрицательную бесконечность, положительный и отрицательный нуль.
Ответ №2:
Я думаю, что удвоения XPath 1.0-это 64-разрядные числа с плавающей запятой, такие же, как двойные числа Java или C# или числа JavaScript, в основном основанные на одном и том же стандарте IEEE. XPath 2 или более поздние версии не изменили этот тип чисел, вместо этого система типов была дополнена другими числовыми типами из языка XML-схемы, такими как xs:integer
, xs:decimal
.