for循环中的条件验证

时间:2017-06-04 16:33:11

标签: go controls

我的下面的代码让平方根工作正常

package main

import (
    "fmt"
    "math"
)

func main() {
    fmt.Println(Sqrt(9))
}

func Sqrt(x float64) float64 {
    v := float64(1)
    p := float64(0)

    for {
        p = v
        v -= (v*v - x) / (2 * v)
        fmt.Println(toFixed(p, 5), toFixed(v, 5))
        if toFixed(p, 5) == toFixed(v, 5) { 
            break
        }
    }

    return v
}

func toFixed(num float64, precision int) float64 {
    output := math.Pow(10, float64(precision))
    return float64(round(num*output)) / output
}

func round(num float64) int {
    return int(num + math.Copysign(0.5, num))
}

但是如果我在Sqrt函数中更改for循环并删除如下所示的循环中断,那么控制流不会进入for循环并且Sqrt()函数退出时值为1。

for toFixed(p, 5) == toFixed(v, 5) {
    p = v
    v -= (v*v - x) / (2 * v)
    fmt.Println(toFixed(p, 5), toFixed(v, 5))
}

您可以在上面的代码中提出建议吗?

由于

1 个答案:

答案 0 :(得分:0)

您应该检查!=条件中的不平等for

我修改了你的代码,现在似乎工作正常:

package main

import (
    "fmt"
    "math"
)

func main() {
    fmt.Println(Sqrt(9))
}

func Sqrt(x float64) float64 {
    v := float64(1)
    p := float64(0)

    for toFixed(p, 5) != toFixed(v, 5) {
        p = v
        v -= (v*v - x) / (2 * v)
    }

    return v
}

func toFixed(num float64, precision int) float64 {
    output := math.Pow(10, float64(precision))
    return float64(round(num*output)) / output
}

func round(num float64) int {
    return int(num + math.Copysign(0.5, num))
}