2015-12-01 38 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个答案有何不同? –