Scala: overflow despite use of Long when adding
scala
Solution
It's a bug of Range. There is the source code of Range's foreach method:
override def foreach(f: Int => Unit) {
if (step > 0) {
var i = this.start
*val until = if (inInterval(end)) end + 1 else end* //bug here!!!
while (i < until) {
f(i)
i += step
}
} else {
var i = this.start
val until = if (inInterval(end)) end - 1 else end
while (i > until) {
f(i)
i += step
}
}
}
Problem
On 2.7.5.final, I'm attempting to add a Iterable list of Ints like so ``` def sum(xs: Iterable[Int]): Long = { var sum = 0L xs.foreach((x) => sum = sum + x) sum } println(sum(List(1, Integer.MAX_VALUE - 1))) println(sum(Integer.MAX_VALUE - 1 to Integer.MAX_VALUE)) println(0L + Integer.MAX_VALUE - 1 + Integer.MAX_VALUE) ``` When I run, I get ``` 2147483647 0 4294967293 ``` And, you might say "use reduceLeft(_ + _)", but it seems to only be able to return the same type as elements in the list... but I want to accumulate to a Long, so I don't have overflow issues. Update 2009-10-28 This is a bug in Range, as pointed out by Eastsun. It's been reported to the Scala team in ticket 2535