12
votes

Java: mettre en œuvre un entier non signé 128 bits

Tout d'abord, je devrais demander:

Est-ce que quelqu'un sait une mise en œuvre actuelle 128B UINT pour Java?

J'ai besoin de quelque chose pour contenir des valeurs cardinales naturelles. IE: un immense comptoir.
Je connais des Bigintegers, qui sont lents et immuables. Un 128B Uint a du sens ...

Je pensais à mettre en œuvre un oword en utilisant une paire de longs primitifs.

Les débordements lanceraient une exception et non enveloppants.

Quel exemple Sourcecode / Blogs dois-je rechercher pour mettre en œuvre le fonctionnement de cette classe?


2 commentaires

Mise en œuvre quelque chose de similaire il y a un an, et tout ce que je peux dire, c'est le cas: j'espère que vous n'aurez pas à mettre en œuvre un modulo / division précis ...;)


Vous pouvez attraper mutaablebiginteger de Openjdk DOCJAR.ORE/HTML/API/ Java / Math / MutableBiginteger.java.html


3 Réponses :


0
votes

Pourquoi ne pas utiliser BigInteger?


3 commentaires

BigInteger est lent Quand tout ce dont vous avez besoin n'est qu'un peu plus de 64 bits. Ran dans ce problème il y a un an et s'est avéré être 25 fois plus lent que l'original long. Voir cet anwer pour plus de détails: Parce que c'est la réponse acceptée, envisageant que l'OP a dit qu'il ne voulait pas de BigInteger.


Tim, votre commentaire contient un lien brisé.



4
votes

J'utiliserais des entiers 32 bits comme représentation, car vous avez besoin d'un type plus grand (long) pour obtenir la précision supplémentaire pour le bit de transport, la détection et la multiplication de trop-plein. Pensez à un entier 32 bits en tant que chiffre et appliquez les algorithmes de l'école primaire.


4 commentaires

Vous pouvez utiliser 64 bits Longs juste bien ==> deux fois plus vite. Une opération peut être déterminée par des modifications apportées au bit des signes.


@Ira Baxter je doute que ce serait plus rapide. Ce serait possible mais plus compliqué pour ajouter, mais pas pour la multiplication. Java BigInteger utilise Int [], et je suppose qu'ils savent ce qu'ils font.


Si vous souhaitez un forfait de plus haute performance, vous utilisez la plus grande wordsize disponible sur votre machine pour laquelle il existe un support d'instruction de machine natif. C'est difficile de trouver un PC ces jours-ci qui n'est pas 64 bits. Je me tiens à ma position: utilisez une longue. Les algorithmes du package de Bigint sont probablement typiques de la plupart des packages de multiplication; longtemps devrait tomber relativement facilement en place. Les ajouts de grandes grossistes prennent désormais une moitié autant de cycles. Les multiplications doivent être 4X aussi rapidement car vous n'avez besoin que de 1 produit au lieu de 4 produits croisés à moitié à large.


Je pourrais adoucir cela un peu: vous voulez que le plus grand ensemble de bits pour lesquels vous pouvez obtenir un produit de double précision à partir de deux multiples multiples de précision unique. Java Ints couners comme longs satisfaite cela de manière indépendante de Java, qui justifie votre réponse. Si vous avez besoin d'une vitesse, vous allez tomber dans le code de la machine natif. Sur le X86, l'unité FP offre un minimum de précision de 80 bits qui implique que vous souhaitiez choisir des "chiffres" 40 bits.