2014-03-04 9 views
5

Was ist der einfachste Weg, um die Maschine Epsilon in Go (Golang) zu bekommen? Was ist mit anderen Aspekten von Gleitkommazahlen wie Präzision, min Exponent, max Exponent, Wobble, etc?Der einfachste Weg, um die Maschine Epsilon zu erhalten (Golang)

Ich realisiere, dass es das math/const-Paket mit den Max und Min für die verschiedenen Float-Typen gibt (http://golang.org/src/pkg/math/const.go), aber keine anderen Informationen. Ein Grund, den ich gerne wissen möchte, ist zu überprüfen, dass ich die maximale Genauigkeit für eine gegebene Berechnung erreicht habe, die die Maschine ausführen kann, so dass ich nicht zu früh aufhöre oder versuche, länger als nötig zu arbeiten.

Das andere ist nur für Neugier.

Dank

EDIT:

Für den Spaß, den ich von der Schule in einigen Notizen nachgeschlagen, wie das epsilon manuell für die Spaßen zu berechnen und hier ist eine grobe Übersetzung von C++ http://play.golang.org/p/XOXwIdNfsa

genießen EDIT: Kommentar von unten (dank für einen idiomatischen Weg zu finden, epsilon):

Verwenden epsilon := math.Nextafter(1, 2) - 1Playground-Nick Craig-Wood 5. März, um 8:07

Antwort

8

Es ist nicht definiert, fand ich das Problem gelöst, wie „wie beabsichtigt“ auf dem issue tracker:

https://code.google.com/p/go/issues/detail?id=966

Der Vorschlag scheint zu sein math.Nextafter zu verwenden die herzuleiten Wert, wenn Sie es brauchen.

Insbesondere ist die Formel math.Nextafter(1.0,2.0)-1.0 (das zweite Argument kann eine beliebige Zahl größer als 1,0 sein).

+0

Link für die faulen http://golang.org/pkg/math/#Nextafter ... danke! – sbditto85

+4

Verwenden Sie 'epsilon: = math.Nextafter (1, 2) - 1' [Spielplatz] (http://play.golang.org/p/EkigXdFDQE) –

1

7.0/3 - 4./3 - 1. sollte jede Sprache funktionieren, soweit ich verstehe, könnte ich falsch liegen.

package main 

import "fmt" 

func main() { 
    f32 := float32(7.)/3 - float32(4.)/3 - float32(1.) 
    fmt.Println(f32) 

    f64 := float64(7.)/3 - float64(4.)/3 - float64(1.) 
    fmt.Println(f64) 
} 

ergibt:

-1.1920929e-07 
2.220446049250313e-16 

einnehmen, sollten die absoluten (unsigned) Wert von F32 korrekt sein.

+1

Wissen Sie, woher diese Formel abgeleitet ist? oder warum es funktioniert? – sbditto85

+1

(7/3) - (4/3) wird (3/3) durch "seltsame" Fließkommazahlen erhalten, die nicht korrekt dargestellt werden können ... was -1 sollte uns den Unterschied geben ... ich denke? – sbditto85

+0

Sicher, siehe Problem 3 von hier: http://rstudio-pubs-static.s3.amazonaws.com/13303_daf1916bee714161ac78d3318de808a9.html – Moustache

Verwandte Themen