2017-09-15 4 views
0

Ich muss die Differenz einer gegebenen Sequenz von Dezimalzahlen dynamisch ermitteln. Die Reihenfolge gegeben:Ermitteln der Differenz der Dezimalfolge dynamisch

my_seq <- seq(0, 10, 0.1) 

Wo 0,1 kann eine beliebige Dezimalstelle (0,01, 0,5), aber bin mit 0.1 für das Beispiel. Mein Versuch, um festzustellen, dass die Granularität 0,1:

# Generating sequence. 
my_seq <- seq(0, 10, 0.1) 

# Attempting to find difference. 
uni_diff <- unique(diff(my_seq)) 
print(uni_diff) # Will be multiple, due to floating point behavior. 

# Printing out uni_diff for visualization. 
print(sprintf("%.54f", uni_diff)) 

Wie am Ende erwähnt, meine differenzier aufgrund fehlschlägt, wie Gleitkommazahlen in Computern verarbeitet werden, „Circle 1“ in der R Inferno http://www.burns-stat.com/pages/Tutor/R_inferno.pdf

sehen

Gibt es einen zuverlässigen Weg, dies zu tun? Ich kann den Benutzer zwingen, mir die Granularität zu sagen, die funktioniert, aber aus der gegebenen Sequenz automatisch bestimmen könnte.

EDIT:

weiter um mein Problem veranschaulichen. Nehmen wir an, ich gab Ihnen:

x = c(0.1, 0.2, 0.3) 

Und dann gefragt, wie Sie feststellen, dass 0,1 der Unterschied zwischen jeder Zahl ist. Wie würde das gemacht werden? Es ist trivial für ganze Zahlen, aber nicht für Gleitkommawerte.

Danke.

+2

I verstehst du nicht: suchst du * genau * 0,1? Es existiert nicht. Um sich davon zu überzeugen, renne 'print (sprintf ("%. 54f ", 0.1))'. –

+2

Wenn Sie über einen "guten" Wert besorgt sind, um kleinere Abrundungsunterschiede zu behandeln, versuchen Sie 'mean (diff (my_seq))' – G5W

+0

Ich versuche zu bestimmen, was das "von" von einer gegebenen Dezimalfolge ist. Zum Beispiel, wenn gegeben (0,1, 0,2, 0,3) wie viel sind diese segmentiert von? Gleitkomma-Probleme machen dies schwierig. Ich weiß nicht 0.1 im Voraus. – giraffehere

Antwort

2

Es gibt keine exakte Darstellung von 0,1 als Fließkommazahl, daher erhalten Sie keine genaue Antwort. Nach dem Kommentar von @RuiBarradas, könnten Sie die Unterschiede mit hohen Präzision ausdrucken und sehen die Variation

## print(sprintf("%.32f", diff(my_seq)))   
## This will produce too much output 

table(sprintf("%.32f", diff(my_seq))) 

0.09999999999999964472863211994991 0.09999999999999986677323704498122 
           44         4 
0.09999999999999997779553950749687 0.10000000000000000555111512312578 
           6         2 
0.10000000000000003330669073875470 0.10000000000000008881784197001252 
           1         23 
0.10000000000000053290705182007514 0.10000000000000142108547152020037 
           16         4 

Da Sie viele ähnlichen Darstellungen von 0,1 erhalten, kann es am besten verwenden mean(diff(my_seq))

sprintf("%.32f", mean(diff(my_seq))) 
[1] "0.10000000000000000555111512312578"