C'è qualcosa di rotto o non riesco a capire cosa sta succedendo?Come modificare il doppio con il suo più piccolo incremento
static String getRealBinary(double val) {
long tmp = Double.doubleToLongBits(val);
StringBuilder sb = new StringBuilder();
for (long n = 64; --n > 0; tmp >>= 1)
if ((tmp & 1) == 0)
sb.insert(0, ('0'));
else
sb.insert(0, ('1'));
sb.insert(0, '[').insert(2, "] [").insert(16, "] [").append(']');
return sb.toString();
}
public static void main(String[] argv) {
for (int j = 3; --j >= 0;) {
double d = j;
for (int i = 3; --i >= 0;) {
d += Double.MIN_VALUE;
System.out.println(d +getRealBinary(d));
}
}
}
Con uscita:
2.0[1] [00000000000] [000000000000000000000000000000000000000000000000000]
2.0[1] [00000000000] [000000000000000000000000000000000000000000000000000]
2.0[1] [00000000000] [000000000000000000000000000000000000000000000000000]
1.0[0] [11111111110] [000000000000000000000000000000000000000000000000000]
1.0[0] [11111111110] [000000000000000000000000000000000000000000000000000]
1.0[0] [11111111110] [000000000000000000000000000000000000000000000000000]
4.9E-324[0] [00000000000] [000000000000000000000000000000000000000000000000001]
1.0E-323[0] [00000000000] [000000000000000000000000000000000000000000000000010]
1.5E-323[0] [00000000000] [000000000000000000000000000000000000000000000000011]
Cosa stai cercando di fare? Qual è la tua domanda? – Sjoerd
La mia domanda è: "Come modificare il doppio con il suo più piccolo incremento", e questo è il mio sforzo che cosa è fallito. – Margus
perché non solo modificare quei bit se si vuole fare l'incremento più piccolo, fallisce per 1 e 2 perché MIN_VALUE è piccolo (molto piccolo) quindi 0 + veramente piccolo = veramente piccolo, ma 2+ molto piccolo ~ = 2 è causa di Il punto FLOATING il valore min è con il punto il più a sinistra possibile mentre per due è da qualche parte nel mezzo, a sinistra perde. puoi vedere le sue circa 300 cifre dopo il punto che la differenza dovrebbe essere, mentre un doppio memorizza solo circa 15-20 cifre significative. – flownt