Sto implementando un'implementazione più veloce BigInt
e non sono sicuro su quanto dovrei andare per fornire l'interoperabilità con la piattaforma sottostante.Quali problemi devo aspettarmi quando uso Reflection per interfacciare con java.math.BigInteger?
Oggi BigInt
solo avvolge una BigInteger
e il valore bigInteger
solo restituisce il valore avvolto:
class BigInt(val bigInteger: BigInteger) ...
Perché io non sto avvolgendo un tipo Java, avrei dovuto fare qualcosa di simile
final class BigInt private(final val signum: Int,
final private[math] val arr: Array[Int])
def bigInteger: java.math.BigInteger = {
// Avoid copying of potentially large arrays.
val ctor = classOf[java.math.BigInteger]
.getDeclaredConstructor(classOf[Array[Int]], classOf[Int])
ctor setAccessible true
ctor.newInstance(arr, signum.asInstanceOf[Object])
}
...
}
Ciò può causare problemi o esiste un modo migliore per farlo?
Non so quanto è grande il numero, ma copiare una piccola serie di intro potrebbe essere più veloce rispetto all'utilizzo del riflesso ... – paradigmatic
Sì, certo. Non importa per i piccoli array, ma la dimensione dei numeri è limitata solo dalla RAM. Semplicemente non voglio mangiare memoria quando si spostano dati da una struttura dati immutabile a un'altra. – soc
Il numero di atomi nell'intero universo è comunemente stimato in 10^80. Con solo 9 * 32 bit, è possibile assegnare un indice univoco a ciascuno. Credo fermamente che se hai bisogno di un numero naturale più grande di quello, probabilmente è un bug o un errore di progettazione ... – paradigmatic