Этот вопрос является следующим: a previous question I asked. Ответы, которые я получил, показали, что я использую библиотеку Go math.Big. В этом вопросе я использую библиотеку, но, к сожалению, малоэффективен.Точность поплавка в Go
Я пытаюсь использовать формулу Бине для вычисления fib (100). Я использую Go's Big.Float, но безуспешно. Я получаю точность до 10 десятичных знаков. мест. Пожалуйста, порекомендуйте.
Я стараюсь избегать циклов/рекурсии, поскольку я думаю, что эти подходы будут не масштабируются хорошо. Следовательно, моя попытка использовать формулу Бине
// в настоящее время приводит к неточным результатам по мере увеличения ввода.
package main
import (
"fmt"
"math/big"
"math"
"strconv"
)
func fib(n int) float64 {
var sroot5 = new(big.Float).SetPrec(200).SetFloat64(2.236067977499789696409173668731276235440618359611525724270897)
var phi = new(big.Float).SetPrec(200).SetFloat64(1.61803398874989484820458683436563811772030917980576286213544862)
var minusPhi = new(big.Float).SetPrec(200).SetFloat64(-0.61803398874989484820458683436563811772030917980576)
var fltP float64;
fltP, _ = phi.Float64()
var fltN float64;
fltN, _ = minusPhi.Float64()
var denom float64
denom, _ = sroot5.Float64()
// Magic fib formula (Binet) is:
// (Phi^n - (-phi^n))/sqrt(5)
z := (math.Pow(fltP, float64(n)) - math.Pow(fltN, float64(n)))/denom
return math.Ceil(z)
}
func main() {
fib(100)
fmt.Println(strconv.FormatFloat(fib(100), 'f', 0, 64))
fmt.Println("true answer of fib(100) should be -> 354224848179261915075")
}
Read http://floating-point-gui.de/ и рассмотреть возможность использования некоторые [bignum ] (https://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic) библиотека –
Вчера вы попросили в основном то же самое: [Точность в программах Go] (http://stackoverflow.com/questions/32143511/accuracy-in -go-programs) –
Обратите внимание, что аргумент 'SetFloat64()' имеет тип 'float64 ', поэтому ваша высокая точность усекается до точности' float64' перед преобразованием в большой float. – fuz