2015-12-01 37 views
-3
package main 

import (
    "fmt" 
    "math" 
) 

func main() { 
    // x= +- sqrtB-4ac/2a 
    cal() 
} 

func cal() { 
    b := 3 
    a := 4 
    c := 2 
    b2 := float64(b*b) 
    ac := float64(4)*float64(a)*float64(c) 
    q := math.Sqrt(b2-ac) 
    fmt.Print(q) 
} 

這將輸出一個NaN,但爲什麼。我正在嘗試製作一個二次式計算器。我只想要輸出這個數字。爲什麼花車和ints = Nan?在去

+2

嘗試'q:= math.Sqrt(math.Abs​​(b2-ac))' –

+1

並非每個二次方程都有實數解 – kostya

回答

5

因爲你正在試圖取一個負數不是有效運算的平方根(不僅僅在Go中,而是在數學運算中),所以它返回NaN,它是Not A Number的首字母縮寫。

b := 3 
a := 4 
c := 2 
b2 := float64(b*b) // sets b2 == 9 
ac := float64(4)*float64(a)*float64(c) // ac == 32 
q := math.Sqrt(b2-ac) // Sqrt(9-32) == Sqrt(-23) == NaN 
fmt.Print(q) 
q = math.Sqrt(math.Abs(b2-ac)) // suggested in comments does Sqrt(23) == ~4.79 
// perhaps the outcome you're looking for. 

編輯:請不要在數學位上爭論語義。如果你想討論負數的平方根,這不是地方。一般來說,不可能取負數的平方根。

2

由於您正在取一個負數的平方根,所以得到了一個虛構的結果(sqrt(-9) == 3i)。這當然不是你想要做的。相反,這樣做:

func main() { 
    b := float64(3) 
    a := float64(4) 
    c := float64(2) 

    result := [2]float64{(-b + math.Sqrt(math.Abs(b*b - 4*a*c)))/2 * a, 
         (-b - math.Sqrt(math.Abs(b*b - 4*a*c)))/2 * a)} 
    fmt.Println(result) 
} 
1

你嘗試的Sqrt負數這個理由退貨總是NaN(非數字) 我跑你的代碼,並打印結果:

b := 3 
    a := 4 
    c := 2 
    b2 := float64(b*b) 
    fmt.Printf("%.2f \n", b2) 
    ac := float64(4)*float64(a)*float64(c) 
    fmt.Printf("%.2f \n", ac) 
    fmt.Printf("%.2f \n", b2-ac) 
    q := math.Sqrt(b2-ac) 
    fmt.Print(q) 

控制檯: 9.00 32.00 -23.00 NaN的

的Sqrt在Golang:https://golang.org/pkg/math/#Sqrt

+0

,這與其他2個答案有何不同? –