XPath 1.0 IEEE 754 — минимальное количество битов?

#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 .