XPath 1.0 IEEE 754 - 最小位数?

XPath 1.0 IEEE 754 - minimum number of bits?

我必须知道在将值转换为 IEEE 中定义的浮点数时,XPath 处理器通常使用的最小位数(32、64 或 128)是多少 754.

XML XPath 语言 (XPATH) 版本 1.0

(https://www.w3.org/TR/1999/REC-xpath-19991116/)

第 4.4 节的陈述:

"数字函数将其参数转换为数字如下:"

我查看了 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 != '.') && ((*cur < '0') || (*cur > '9')) && (*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') && (*cur <= '9')) {
        ret = ret * 10;
        tmp = (*cur - '0');
        ok = 1;
        cur++;
        temp = (double) tmp;
        ret = ret + temp;
    }
#else
    ret = 0;
    while ((*cur >= '0') && (*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')) && (!ok)) {
            return(xmlXPathNAN);
        }
        while (*cur == '0') {
            frac = frac + 1;
            cur++;
        }
        max = frac + MAX_FRAC;
        while (((*cur >= '0') && (*cur <= '9')) && (frac < max)) {
            v = (*cur - '0');
            fraction = fraction * 10 + v;
            frac = frac + 1;
            cur++;
        }
        fraction /= pow(10.0, frac);
        ret = ret + fraction;
        while ((*cur >= '0') && (*cur <= '9'))
            cur++;
    }
    if ((*cur == 'e') || (*cur == 'E')) {
      cur++;
      if (*cur == '-') {
        is_exponent_negative = 1;
        cur++;
      } else if (*cur == '+') {
        cur++;
      }
      while ((*cur >= '0') && (*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 位 space 来存储结果,但还有其他 XPath 处理器(例如 saxon:https://www.saxonica.com/),并且有可能进行更多实现出现。 我目前正在开发的软件需要支持 XPath 1.0 的每个当前可用的和未来的每个实现,并且一些计算取决于这个特定的最小值。


有人在开发 XPath 处理器时,是否对此事有某种更具体的要求?

提前谢谢你。

我认为 XPath 1.0 double 是 64 位浮点数,很像 Java 或 C# double numbers 或 JavaScript numbers,基本上依赖相同的 IEEE 标准。 XPath 2 或更高版本没有更改该数字类型,而是使用 XML 模式语言中的其他数字类型增强了类型系统,例如 xs:integerxs:decimal.

XPath 1.0 spec 要求双精度(64 位):

A number represents a floating-point number. A number can have any double-precision 64-bit format IEEE 754 value. These include a special "Not-a-Number" (NaN) value, positive and negative infinity, and positive and negative zero.