Are there limits of precision on the memory capacity of double?

耗尽温柔 提交于 2019-12-11 03:32:58

问题


I'm reading an introductory book on Java and ran into something I don't quite understand. In covering variable types, the author states "the word double stands for numbers between

This struck me as odd, since as written, it would include all numbers on the real number line between the two aforementioned limits.

From my understanding, double is a primitive data type assigned 64 bits of memory. In turn, it's clear to me that 5.9 is a perfectly fine double, or float for that matter. However, I'm not sure how the series

i.e., 5.9, 5.99, 5.999, 5.9999, ... would fit in memory as k approaches infinity.

Is my intuition correct that not all real numbers between the author's two limits would be appropriately held in memory as a double?


回答1:


Is my intuition that not all real numbers between the author's two limits would be appropriately held in memory as a double?

Yes, you are right.

Even the MOST obvious "doubles" cannot be stored correctly. For instance 0.1 is "1/10" - have you ever divided by ten in a base-2 system? That's an infinite number (comparable to "/3" in the base 10 system)

(This fact btw was responsible for the Patriot-Bug: http://sydney.edu.au/engineering/it/~alum/patriot_bug.html)

And therefore even some obvious easy maths will go wrong on java:

Take the compiler of your choice and try this:

System.out.println(0.8 == (0.1 + 0.7));

Whoops, it will output false.




回答2:


Indeed. In one sentence, ints are exact, while floats and doubles are stored using scientific notation notated in bits. This means that there will be a roundoff error, as scientific notation goes.

As per wikipedia:

Sign bit: 1 bit

Exponent width: 11 bits

Significand precision: 53 bits (52 explicitly stored)

An interesting note: the exponent has 1 bit storing its sign also!

To read more: Wikipedia - Double precision floating point format




回答3:


The double data type is a double-precision 64-bit(8 bytes) IEEE-754 floating point.The format consists of 1-bit for sign, 11-bits for exponent and the remaining 52 bits of the significand represent the fraction part. With the 52 bits of the fraction significand appearing in the memory format, the total precision is therefore 53 bits (approximately 16 decimal digits, 53 log10(2) ≈ 15.955). The 11 bit width of the exponent allows the representation of numbers with a decimal exponent between 10E−308 and 10E+308, with full 15–17 decimal digits precision. Double and float are not exactly real numbers.There can be infinite number of real numbers in any range, but it should always be kept in mind that there are only finite number of bits to represent them and hence not all numbers could be represented.

For higher and better precision, you can use BigDecimal class found in the java.math package. http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html



来源:https://stackoverflow.com/questions/30404536/are-there-limits-of-precision-on-the-memory-capacity-of-double

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!