2017-03-21 3 views
0

以下のサンプルプログラムをScalaで異なるパラメータで実行しました。 ScalaのIDEででも、私はダブルとしてのX宣言した「大きすぎる整数」などのエラーを与える1E10と同じですDouble in Scalaの指数形式で数値を渡す必要があるのはなぜですか?

object TestScalaWS { 
    println("Welcome to the Scala worksheet")  //> Welcome to the Scala worksheet 
    3+5            //> res0: Int(8) = 8 
    1.0E5           //> res1: Double(100000.0) = 100000.0 
    def abs(x: Double) = if (x<0) - x else x  //> abs: (x: Double)Double 

    def sqrtIter(guess: Double, x: Double):Double = 
    if (isGoodEnough(guess,x)) guess 
    else sqrtIter(improve(guess,x),x)   //> sqrtIter: (guess: Double, x: Double)Double 

    def isGoodEnough(guess: Double, x: Double) = 
    abs(guess*guess-x) < 0.001     //> isGoodEnough: (guess: Double, x: Double)Boolean 

    def improve(guess: Double, x:Double) = 
     (guess + x/guess)/2       //> improve: (guess: Double, x: Double)Double 


    def sqrt(x:Double) = sqrtIter(1.0,x)   //> sqrt: (x: Double)Double 
    sqrt(2)           //> res2: Double = 1.4142156862745097 
    sqrt(4)           //> res3: Double = 2.0000000929222947 
    sqrt(0.001)          //> res4: Double = 0.04124542607499115 
    sqrt(0.1e-20)         //> res5: Double = 0.03125 
    sqrt(0.1e20)         //> res6: Double = 3.1622776601683793E9 
    sqrt(1.0e20)         //> res7: Double = 1.0E10 
    sqrt(1E9)          //> res8: Double = 31622.776601684047 
    sqrt(1000000000)        //> res9: Double = 31622.776601684047 
    sqrt(1E10)          //> res10: Double = 100000.0 
} 

しかし、SQRT(10000000000)。

コンパイラの解釈の問題があるものの、正確に何を意味するのかわかりません。この問題はScalaでのみ発生しますか? Javaにも存在します。 ?またはScala IDEの問題?

ありがとう、 Gopal。

答えて

1

10000000000と入力すると、1または-35と入力したときと同じように、Intを定義しようとします。

sqrt(2)と入力すると、Intは暗黙的にDoubleに変換されます。これは関数が想定しているものであり、そのような暗黙のコンバータが存在するためです。

ただし、sqrt(10000000000)と入力すると、最初のステップで例外がスローされます。つまり、10000000000という整数をÌnteger.MaxValueより大きい値として定義します。

  • ご入力のためのタイプ定義する第1

  • (ドットまたは指数なしでここ数は Int考えられている):理解することが重要です何

    は後にしたいタイプへの変換が行われることです

  • 次いで、選択されたタイプの規則入力(電話番号がIntとして解析することができないので、これは、あなたの場合にスローステップである)

を解析
関連する問題