IntroduzioneOttenere prossimo numero più piccolo più vicino a un decimale
Per alcuni calcoli ho bisogno di trovare il minor numero possibile posso aggiungere/sottrarre da un numero specificato senza ottenere JavaScript nei guai con il tipo di dati utilizzato interno.
Calcio
ho cercato di scrivere una funzione che è in grado di restituire il numero più vicino accanto al valore nella direzione di valore DIR.
function nextNearest(value, direction) {
// Special cases for value==0 or value==direction removed
if (direction < value) {
return value - Number.MIN_VALUE;
} else {
return value + Number.MIN_VALUE;
}
}
Il problema di questo è che JavaScript utilizza un tipo a galleggiante 64 bit (Credo) che ha diverse dimensioni minime step a seconda del suo esponente corrente.
problema in dettaglio
Il problema è la dimensione del passo a seconda della sua attuale esponente:
var a = Number.MIN_VALUE;
console.log(a);
// 5e-324
console.log(a + Number.MIN_VALUE);
// 1e-323 (changed, as expected)
var a = Number.MAX_VALUE;
console.log(a);
// 1.7976931348623157e+308
console.log(a - Number.MIN_VALUE);
// 1.7976931348623157e+308 (that's wrong)
console.log(a - Number.MIN_VALUE == a);
// true (which also is wrong)
Sommario
Così come posso trovare il numero più piccolo possibile che posso aggiungi/sottrai da un valore specificato in un parametro in qualsiasi direzione? In C++ questo sarebbe facilmente possibile accedendo ai valori binari dei numeri.
È possibile usufruire di [array tipizzati] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) per arrivare al basso rappresentazione di livello di valori in virgola mobile in JavaScript. Crea un elemento Float64Array a 1 elemento e un array UInt8 a 8 elementi entrambi sullo stesso buffer. – Pointy