double 的内存容量有精度限制吗?
Are there limits of precision on the memory capacity of double?
我正在阅读关于 Java 和 运行 的 introductory book 内容,我不太明白。在介绍变量类型时,作者指出“单词 double
代表介于
这让我觉得很奇怪,因为正如所写的那样,它将包括上述两个限制之间的实数线上的所有数字。
根据我的理解,double
是分配了 64 位内存的原始数据类型。反过来,我很清楚 5.9 是一个非常好的双精度值,或者就此而言是浮点数。但是,我不确定系列
即 5.9, 5.99, 5.999, 5.9999, ... 适合内存,因为 k 接近无穷大。
我的直觉是否正确,作者的两个限制之间的 所有 实数都不会作为 double
适当地保存在内存中?
确实如此。一句话,整数是精确的,而浮点数和双精度数是使用以位表示的科学记数法存储的。这意味着会有一个舍入误差,就像科学记数法一样。
根据维基百科:
Sign bit: 1 bit
Exponent width: 11 bits
Significand precision: 53 bits (52 explicitly stored)
一个有趣的注意事项:指数也有 1 位存储其符号!
Is my intuition that not all real numbers between the author's two limits would be appropriately held in memory as a double?
是的,你是对的。
即使是最明显的 "doubles" 也无法正确存储。例如 0.1
是“1/10”——你有没有在 base-2 系统中除以 10?这是一个无穷大的数字(相当于以 10 为基数的系统中的“/3”)
(顺便说一句,这个事实是爱国者虫的罪魁祸首:http://sydney.edu.au/engineering/it/~alum/patriot_bug.html)
因此,即使是一些显而易见的简单数学运算也会在 java 上出错:
使用你选择的编译器试试这个:
System.out.println(0.8 == (0.1 + 0.7));
糟糕,它会输出 false。
double数据类型为双精度64位(8字节)IEEE-754浮点格式point.The由1位符号,11位指数,其余52位有效数字代表小数部分。由于小数有效位的 52 位出现在内存格式中,因此总精度为 53 位(大约 16 位十进制数字,53 log10(2) ≈ 15.955)。指数的 11 位宽度允许用 10E−308 和 10E+308 之间的十进制指数表示数字,具有完整的 15-17 位十进制数字精度。 double 和 float 不完全是实数 numbers.There 可以是任何范围内的无限数量的实数,但应该始终牢记,只有有限数量的位来表示它们,因此并非所有数字都可以表示.
为了获得更高更好的精度,您可以使用 java.math 包中的 BigDecimal class。
http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
我正在阅读关于 Java 和 运行 的 introductory book 内容,我不太明白。在介绍变量类型时,作者指出“单词 double
代表介于
这让我觉得很奇怪,因为正如所写的那样,它将包括上述两个限制之间的实数线上的所有数字。
根据我的理解,double
是分配了 64 位内存的原始数据类型。反过来,我很清楚 5.9 是一个非常好的双精度值,或者就此而言是浮点数。但是,我不确定系列
即 5.9, 5.99, 5.999, 5.9999, ... 适合内存,因为 k 接近无穷大。
我的直觉是否正确,作者的两个限制之间的 所有 实数都不会作为 double
适当地保存在内存中?
确实如此。一句话,整数是精确的,而浮点数和双精度数是使用以位表示的科学记数法存储的。这意味着会有一个舍入误差,就像科学记数法一样。
根据维基百科:
Sign bit: 1 bit
Exponent width: 11 bits
Significand precision: 53 bits (52 explicitly stored)
一个有趣的注意事项:指数也有 1 位存储其符号!
Is my intuition that not all real numbers between the author's two limits would be appropriately held in memory as a double?
是的,你是对的。
即使是最明显的 "doubles" 也无法正确存储。例如 0.1
是“1/10”——你有没有在 base-2 系统中除以 10?这是一个无穷大的数字(相当于以 10 为基数的系统中的“/3”)
(顺便说一句,这个事实是爱国者虫的罪魁祸首:http://sydney.edu.au/engineering/it/~alum/patriot_bug.html)
因此,即使是一些显而易见的简单数学运算也会在 java 上出错:
使用你选择的编译器试试这个:
System.out.println(0.8 == (0.1 + 0.7));
糟糕,它会输出 false。
double数据类型为双精度64位(8字节)IEEE-754浮点格式point.The由1位符号,11位指数,其余52位有效数字代表小数部分。由于小数有效位的 52 位出现在内存格式中,因此总精度为 53 位(大约 16 位十进制数字,53 log10(2) ≈ 15.955)。指数的 11 位宽度允许用 10E−308 和 10E+308 之间的十进制指数表示数字,具有完整的 15-17 位十进制数字精度。 double 和 float 不完全是实数 numbers.There 可以是任何范围内的无限数量的实数,但应该始终牢记,只有有限数量的位来表示它们,因此并非所有数字都可以表示.
为了获得更高更好的精度,您可以使用 java.math 包中的 BigDecimal class。 http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html