Home Software Engineering Floating-point Approximation in Golang | Learn to Grasp Software program Engineering, DevOps and Cloud

Floating-point Approximation in Golang | Learn to Grasp Software program Engineering, DevOps and Cloud

0
Floating-point Approximation in Golang | Learn to Grasp Software program Engineering, DevOps and Cloud

[ad_1]

The problem

Think about the operate

f: x -> sqrt(1 + x) - 1 at x = 1e-15.

We get: f(x) = 4.44089209850062616e-16

This operate entails the subtraction of a pair of comparable numbers when x is close to 0 and the outcomes are considerably faulty on this area. Utilizing pow as a substitute of sqrt doesn’t give higher outcomes.

A “good” reply is 4.99999999999999875... * 1e-16.

Are you able to modify f(x) to present a very good approximation of f(x) within the neighborhood of 0?

The answer in Golang

Possibility 1:

bundle answer
import (
    "math"
)
func F(x float64) float64 {
    return x / (1.0 + math.Sqrt(1.0 + x))
}

Possibility 2:

bundle answer
func F(x float64) float64 {
    return x*(0.5 - x*(0.125 - x*(0.0625 - x*0.0390625)))
}

Possibility 3:

bundle answer
import "math/huge"
func F(x float64) float64 {
  var a, b, c, d, e huge.Float
  a.SetInt64(1)
  b.SetFloat64(x)
  c.SetPrec(106)
  c.Add(&a, &b)
  d.Sqrt(&c)
  e.Sub(&d, &a)
  r, _ := e.Float64()
  return r
}

Take a look at instances to validate our answer

bundle solution_test
import (
  . "github.com/onsi/ginkgo"
  . "github.com/onsi/gomega"
  "math"
  "fmt"
)
func assertFuzzyEquals(act float64, exp float64) {
    var inrange bool
    var merr float64 = 1e-12
    var e float64
    if (exp == 0.0) {
        e = math.Abs(act)
    } else {
        e = math.Abs((act - exp) / exp)
    }
    inrange = (e <= merr)
    if (inrange == false) {
        fmt.Printf("Anticipated ought to be close to: %1.12e , however bought: %1.12en", exp ,act);
    }
    Count on(inrange).To(Equal(true))
}
func dotest(x float64, exp float64) {
    assertFuzzyEquals(F(x), exp)
}
var _ = Describe("Take a look at Instance", func() {
    It("ought to deal with fundamental instances", func() {
        dotest(2.6e-08, 1.29999999155e-08)
        dotest(1.4e-09, 6.999999997549999e-10)
        dotest(5.0e-06, 2.499996875007812e-06)
    })
})

[ad_2]

LEAVE A REPLY

Please enter your comment!
Please enter your name here