Dear community,
I ran into the following issue when started playing with go. Had the
following small program to calculate Fibonacci numbers using the closed
form:
package "fib"
import "math"
var sqrt_5 = math.Sqrt(5.0)
var psi = -1.0/math.Phi
// had to add this to solve accuracy issue
func round(x float64) uint64 {
return uint64(math.Floor(x + 0.5))
}
// find the nth fibonacci number based on Binet's formula
// see here:
https://en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression
func fibonacci(n uint) uint64 {
float_n := float64(n)
return round((math.Pow(math.Phi, float_n) - math.Pow(psi, float_n))/
sqrt_5)
}
When I first tried without doing the "rounding" I did not get whole numbers
as the output (similar program in C++ gave whole numbers without rounding).
Following test is failing without the call to "round()":
package "fib"
import "testing"
var results = map[uint]uint64 {
0: 0,
2: 1,
10: 55,
14: 377,
20: 6765,
29: 514229,
33: 3524578,
59: 956722026041,
}
func Test_fibonacci(t *testing.T) {
for arg, expected := range results {
actual := fibonacci(arg)
if actual != expected {
t.Error("Expected", expected, "got", actual)
}
}
}
Are there known accuracy issues with floating points in go?
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.