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 节的陈述:
"数字函数将其参数转换为数字如下:"
- "由可选的白色space后跟可选的减号后跟数字后跟白色space组成的字符串被转换为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 != '.') && ((*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:integer
、xs: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.
我必须知道在将值转换为 IEEE 中定义的浮点数时,XPath 处理器通常使用的最小位数(32、64 或 128)是多少 754.
XML XPath 语言 (XPATH) 版本 1.0
(https://www.w3.org/TR/1999/REC-xpath-19991116/)
第 4.4 节的陈述:
"数字函数将其参数转换为数字如下:"
- "由可选的白色space后跟可选的减号后跟数字后跟白色space组成的字符串被转换为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 != '.') && ((*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:integer
、xs: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.