public class FloatingPointConverter
extends java.lang.Object
The algorithm for converting a floating point number to a string is taken from Guy L. Steele and Jon L. White, How to Print Floating-Point Numbers Accurately, ACM SIGPLAN 1990. It is algorithm (FPP)2 from that paper. There are three separate implementations of the algorithm:
The choice of method depends on the value of the number being formatted.
The module contains some residual code (mainly the routine for formatting integers) from the class AppenderHelper by Jack Shirazi in the O'Reilly book Java Performance Tuning. The floating point routines in that module were found to be unsuitable, since they used floating point arithmetic which introduces rounding errors.
There are several reasons for doing this conversion within Saxon, rather than leaving it all to Java. Firstly, there are differences in the required output format, notably the absence of ".0" when formatting whole numbers, and the different rules for the range of numbers where exponential notation is used. Secondly, there are bugs in some Java implementations, for example JDK outputs 0.001 as 0.0010, and IKVM/GNU gets things very wrong sometimes. Finally, this implementation is faster for "everyday" numbers, though it is slower for more extreme numbers. It would probably be reasonable to hand over formatting to the Java platform (at least when running the Sun JDK) for exponents outside the range -7 to +7.
Modifier and Type | Field and Description |
---|---|
static long |
DOUBLE_SIGN_MASK |
static int |
FLOAT_SIGN_MASK |
static FloatingPointConverter |
THE_INSTANCE |
Modifier and Type | Method and Description |
---|---|
static FastStringBuffer |
appendDouble(FastStringBuffer s,
double d,
boolean forceExponential)
Append a string representation of a double value to a string buffer
|
static FastStringBuffer |
appendFloat(FastStringBuffer s,
float f,
boolean forceExponential)
Append a string representation of a float value to a string buffer
|
static FastStringBuffer |
appendInt(FastStringBuffer s,
int i)
Format an integer, appending the string representation of the integer to a string buffer
|
public static FloatingPointConverter THE_INSTANCE
public static final long DOUBLE_SIGN_MASK
public static final int FLOAT_SIGN_MASK
public static FastStringBuffer appendInt(FastStringBuffer s, int i)
s
- the string bufferi
- the integer to be formattedpublic static FastStringBuffer appendDouble(FastStringBuffer s, double d, boolean forceExponential)
s
- the string buffer to which the result will be appendedd
- the double to be formattedpublic static FastStringBuffer appendFloat(FastStringBuffer s, float f, boolean forceExponential)
s
- the string buffer to which the result will be appendedf
- the float to be formattedforceExponential
- forces exponential notation if set (if not set, exponential notation
is used only for values outside the range 1e-6 to 1e+6)Copyright (c) 2004-2020 Saxonica Limited. All rights reserved.