2017-04-26 32 views
5

整数,浮点和长Scala中的最大值为:什么是朋友之间的Int.MaxValue?

Int.MaxValue = 2147483647

Float.MaxValue = 3.4028235E38

Long.MaxValue = 9223372036854775807L

来自Scala编译器的作者,Keynote, PNW Scala 2013,幻灯片16 What's Int.MaxValue between friends?

val x1: Float = Long.MaxValue 
val x2: Float = Long.MaxValue - Int.MaxValue 
println (x1 == x2) 

// NO WONDER NOTHING WORKS 

为什么这个表达式返回true

+0

这是否编译? 'x2'后不需要等号吗? – Carcigenicate

+0

我无法复制此内容。相反,我得到一个语法错误。 –

+1

我找到了你提到的幻灯片。您发布的代码与幻灯片上的代码不同。幻灯片上的代码没有语法错误。 –

回答

10

A Float是一个4字节的浮点值。同时Long是一个8字节的值,并且Int也是一个4字节的值。但是,数字以4字节浮点值存储的方式意味着它们只有大约8位的精度。因此,无论最少4个有效字节(另外9-10个数字)的值如何,它们都无法存储Long的4个最重要字节(大约9-10位数字)。

因此,两个表达式的Float表示是相同的,因为不同的位低于Float的分辨率。因此这两个值比较相等。

+3

给+1写一个答案,避免每个回答只是回答“浮点算术吸!”!我们都想。 – ashawley

3

回应Mike Allen的回答,但希望提供一些额外的上下文(将这留作评论而不是单独的答案,但SO的声望功能不会让我)。

整数的最大值范围定义为0到2^n(如果它是一个无符号整数)或-2 ^(n-1)到2 ^(n-1)(对于有符号整数),其中n是底层实现中的位数(在这种情况下n = 32)。如果你想用一个有符号值表示一个大于2^31的数字,你不能使用int。一个签名长的将工作到2^63。对于大于此值的任何事物,有符号浮点数可以上升到大约2^127。

还有一点需要注意的是,这些解决方案问题只有在存储在浮点数中的值接近最大值时才有效。在这种情况下,减法运算会导致真实值的变化,即比第一个值小许多个数量级。浮子不会四舍五入100和101之间的区别,但它可能四舍五入10000000000000000000000000000和10000000000000000000000000001.之间

同去的小值的差。如果您将0.1转换为整数,您会得到0.这通常不被视为整数数据类型的失败。

如果你是对的大小不同的多个数量级的,也不太能容忍舍入误差,则需要数据结构和解释二进制数据表示的固有局限性算法的数字操作。一种可能的解决方案是使用具有较少比特指数的浮点编码,从而限制最大值,但提供更高分辨率是不太重要的比特。为了更详细地检查出:

相关问题