Parsing a double from a string which holds a value greater than Double.MaxValue

前端 未结 1 1117
生来不讨喜
生来不讨喜 2021-01-13 05:36

Consider the following java code:

String toParse = \"1.7976931348623157E308\"; //max value of a double in java        
double parsed = Double.parseDouble(toP         


        
1条回答
  •  一生所求
    2021-01-13 06:22

    The SE 7 version of the parseDouble documentation refers to the valueOf documentation which says:

    Note that the round-to-nearest rule also implies overflow and underflow behaviour; if the exact value of s is large enough in magnitude (greater than or equal to (MAX_VALUE + ulp(MAX_VALUE)/2), rounding to double will result in an infinity and if the exact value of s is small enough in magnitude (less than or equal to MIN_VALUE/2), rounding to float will result in a zero.

    This is consistent with the statement that the rounding to type double is by the usual round-to-nearest rule of IEEE 754 floating-point arithmetic.

    You have to imagine the conversion being done by first calculating the nearest floating point number ignoring the exponent limitation, and then checking whether the exponent fits. Double.MAX_VALUE is the closest number under that rule to some numbers that are strictly greater than it.

    To confirm this is normal rounding behavior, consider the following program:

        public class Test {
          public static void main(String[] args) {
            double ulp = Math.ulp(Double.MAX_VALUE);
            System.out.println(ulp);
            System.out.println(Double.MAX_VALUE);
            System.out.println(Double.MAX_VALUE+ulp/2.0000000001);
            System.out.println(Double.MAX_VALUE+ulp/2);
          }
        }
    

    It outputs:

    1.9958403095347198E292
    1.7976931348623157E308
    1.7976931348623157E308
    Infinity
    

    Adding something even slightly less than half a ulp to Double.MAX_VALUE does not change it. Adding half a ulp overflows to infinity.

    0 讨论(0)
提交回复
热议问题