In einem längeren Skript muss ich die Länge eines Vektors A (2614) mit der Anzahl der Zeilen eines Datenrahmens B (1456000) multiplizieren. Wenn ich das direkt mit length(A) * nrow(B)
mache, bekomme ich die Nachricht NAs produced by integer overflow
, obwohl es kein Problem gibt, wenn ich die gleichen Zahlen multipliziere:
Die einzige Möglichkeit, die Multiplikation zu aktivieren, ist round(length(A)) * nrow(B)
oder length(A) * round(nrow(B))
. Aber die von length
und nrow
erzeugten Zahlen müssen sowieso ganze Zahlen sein! Außerdem habe ich das mit der folgenden Funktion getestet, die auf der Hilfeseite für die Funktion is.integer ...
... und natürlich sind sie ganze Zahlen. Also warum brauche ich die Krücken "rund" hier? Sehr rätselhaft ... Hat jemand eine Idee was im Hintergrund los ist?
Hoffentlich eine grafische Darstellung dessen, was passiert ....
%Vor% 2614 * 1456000
ist ein numeric
, weil beide Operanden tatsächlich der Klasse numeric
angehören. Der Überlauf tritt auf, weil sowohl nrow
als auch length
integer
zurückgeben und daher das Ergebnis eine ganze Zahl ist, aber das Ergebnis die maximale Größe überschreitet, die durch die Klasse integer
dargestellt werden kann (+/- 2 * 10 ^ 9). A numeric
oder double
können 2e-308 to 2e+308
enthalten. Um Ihr Problem zu lösen, verwenden Sie einfach as.numeric(length(A))
oder as.double(length(A))
.
Tags und Links r integer-overflow