Kurze Frage an euch, und hab ich in 'nem anderen Forum gelesen:
Wie viele double-Werte gibt es zwischen 1.0 (eingeschlossen) und 3.0 (ausgeschlossen) ?
Und, damit es nicht zu leicht ist:
Wie viele double-Werte gibt es zwischen 1.0 (eingeschlossen) und 5.0 (ausgeschlossen) ?
Über doubleToLongBits und aus dem Long mit toBinaryString dürfte man die Binäre Darstellung bekommen, wenn man da dann ein bischen rumschaut, dann dürfte man auch von der binären Darstellung, gerade wenn man mit nextUp ein bischen Zählt auf eine Idee kommen wie man das ganze hochrechnen könnte.
Wenn ich das richtig sehe, wird ja hauptsächlich die Mantisse hochgezählt, bis man einen neuen Exponenten braucht. Da geht dann das Spiel von vorne los.
Alles was du wissen musst, ist doch, dass für jeden der 2^11 Exponenten 2^52 Mantissen zur Verfügung stehen (mit Vorzeichen-Bit 2^53, aber das habe ich weggelassen). Nun setzt du d=3 bzw. 5, rechnest und anschließend rechnest du nochmal mit d=1 (2. Term). Zuletzt ziehst du den höheren Wert vom niedrigeren ab. Für Inklusivwerte lässt du die -1 weg.
1 <= 3: 6755399441055744
3 <= 5: 3377699720527872
1 <= 5: 10133099161583616
import java.lang.Math;
public class CountNumbers
{
public static void main(String[] args)
{
double lowerBound = 3.0;
double upperBound = 5.0;
long lowerAsLongBits = Double.doubleToLongBits(lowerBound);
long upperAsLongBits = Double.doubleToLongBits(upperBound);
long result = upperAsLongBits - lowerAsLongBits;
System.out.println(lowerAsLongBits);
System.out.println(upperAsLongBits);
System.out.println(result);
}
}
Zumindest für alle Positiven Zahlen bei denen upperBound < lowerBound ist. Bei Zahlen kleiner 1 bin ich mir noch etwas unschlüssig.
Da das Format ja so gestrickt ist, dass wenn es bei der Mantisse zu einem überlauf käme, dieser ja eigentlich den Exponenten erhöht und dieser ja links von der Mantisse steht, dürfte das einigermassen hinhauen.
Alle Angaben ohne Gewähr. Würde aber auch gerne die Antwort sehen die CB hat, falls er da mal ein Ergebnis bekommt. Mit den RawBits kommt, übrigens das selbe raus.
ich hatte über float hochgezählt, dann im Verhältnis 23 zu 52 (Mantissebits) die Anzahl der double-Werte im Intervall hochgerechnet; in’ner Annahme, es gibt für die Werte genausoviele Exponenten"gruppen" in float wie in double.
Es gilt glaub’ ich:
a^b für alle b>=0, < (a+1)^c für alle c>=0. (b und c sind Mantisse(n).)
(Wenn sich der Exponent erhöht, sind alle _ Werte größer…)