Java “的含义;“总震级”;数不清
我被Java语言规范中“总体规模”的含义难住了: 加宽基元转换不会丢失有关数值总体大小的信息Java “的含义;“总震级”;数不清,java,numbers,Java,Numbers,我被Java语言规范中“总体规模”的含义难住了: 加宽基元转换不会丢失有关数值总体大小的信息 是“数量级”还是“绝对值”?还是别的什么?来自维基百科的文章: 在数学中,大小是一个数学对象的大小,通过这一特性,可以将该对象与同类的其他对象进行大小比较 简而言之,32767的震级是32767。大小等于数字的值 在JLS规范中,我认为他们使用震级来表示数字中的位数。32767是16位有符号字段中可以容纳的最大整数。如果将32767移动到少于15位的位字段中,则该数字将不再是32767。这叫做变窄。如果
是“数量级”还是“绝对值”?还是别的什么?来自维基百科的文章: 在数学中,大小是一个数学对象的大小,通过这一特性,可以将该对象与同类的其他对象进行大小比较 简而言之,32767的震级是32767。大小等于数字的值 在JLS规范中,我认为他们使用震级来表示数字中的位数。32767是16位有符号字段中可以容纳的最大整数。如果将32767移动到少于15位的位字段中,则该数字将不再是32767。这叫做变窄。如果将32767移动到超过15位(或16位,有符号)的位字段中,则32767的值将保留。这叫做加宽
数量级是数字的加减。例如,使用以10为基数的整数,32767比3276高一个数量级。3276比327高一个数量级。好的,这里是对正式定义的另一次尝试
如果
f(x)
是一个加宽的转换,那么在我看来,对于每个x,它基本上意味着“抽象概念值”,而不是用于表示值的实际位序列。顺便说一句,float->double
转换不会保留整体大小。@biziclop-如果它是strictfp
,则它不应该丢失任何信息:“在strictfp
表达式(§15.4)中,从float到double根本不会丢失任何信息;数值被准确地保留下来。”@AndyBrown Yes。这只是JLS中表达这一点的方式有点奇怪:首先他们声明这不会发生,然后五段之后他们添加了一条警告,呃…实际上,如果没有strictfp
,它确实会发生。@biziclop你能举个例子来说明你所说的“抽象概念价值”是什么意思吗?@Julian正在阅读它,我可能用词不对。如果以float
数字200.4
为例,加宽转换将始终保留高阶数字。它可能会失去精度(低阶数字),因此您可能会得到long
值200
,但它仍然在相同的范围内。然而,如果将200.4
转换为字节(缩小转换),则会得到一个完全不同的数字:-56
。这似乎与问题中引用的“幅度”的使用方式相矛盾。根据数学定义,从float到long的加宽转换可能会改变大小,因为小数点后的数字可能会在转换时丢失。不幸的是,他们在JLS中讨论的大小并不完全符合此定义。很接近,但不是很接近。@Julian实际上我是通过另一种方式得到的:long->float是一种加宽的转换,可能会丢失精度。最后一位应该是f(x)
,而不是f(x)=f(y)
?@Julian否,因为丢失精度意味着附近的一些值将被转换为相同的值。