Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

nums (suite du #1443) #6783

Closed
vicuna opened this issue Oct 19, 2002 · 3 comments
Closed

nums (suite du #1443) #6783

vicuna opened this issue Oct 19, 2002 · 3 comments

Comments

@vicuna
Copy link

vicuna commented Oct 19, 2002

Original bug ID: 1445
Reporter: administrator
Status: closed
Resolution: won't fix
Priority: normal
Severity: feature
Category: ~DO NOT USE (was: OCaml general)

Bug description

Voilà, je propose d'ajouter ça dans le fichier nat_stubs.c:

static int custom_compare_nat(value nat1, value nat2)
{
return
(BnCompare
(Bignum_val(nat1), 0,
BnNumDigits(Bignum_val(nat1), 0, Wosize_val(nat1) - 1),
Bignum_val(nat2), 0,
BnNumDigits(Bignum_val(nat2), 0, Wosize_val(nat2) - 1) ) );
}

static long custom_hash_nat(value nat)
{
return (BnGetDigit(Bignum_val(nat), 0));
}

static struct custom_operations nat_operations = {
"_nat",
custom_finalize_default,
custom_compare_nat,
custom_hash_nat,
serialize_nat,
deserialize_nat
};

Ça convient ?

-- Alain

@vicuna
Copy link
Author

vicuna commented Nov 7, 2002

Comment author: administrator

Voilà, je propose d'ajouter ça dans le fichier nat_stubs.c:

static int custom_compare_nat(value nat1, value nat2)
[...]

Gros problème: la comparaison ainsi définie sur le type "nat" se
prolonge automatiquement en une comparaison sur les types "big_int",
"ratio" et "num" qui est incorrecte... En effet, la comparaison entre
"big_int" se fait alors lexicographiquement sur des paires
(signe, valeur-absolue), et donc

     <big_int -2>  est inférieur à <big_int -3>

puisque les paires les représentant ont le même signe et des valeurs
absolues en relation "est inférieur à".

Même problème avec les rationnels et donc les nums.

De plus, même l'égalité est fausse dans le cas de rationnels non
normalisés.

La solution actuelle (faire une erreur) est donc préférable.

  • Xavier Leroy

@vicuna
Copy link
Author

vicuna commented Nov 7, 2002

Comment author: administrator

Would lead to wrong results of comparison on (negative) big_int, on ratio, and
on num.

@vicuna vicuna closed this as completed Nov 7, 2002
@vicuna
Copy link
Author

vicuna commented Nov 7, 2002

Comment author: administrator

On Thu, 7 Nov 2002, Xavier Leroy wrote:

Voilà, je propose d'ajouter ça dans le fichier nat_stubs.c:

static int custom_compare_nat(value nat1, value nat2)
[...]

Gros problème: la comparaison ainsi définie sur le type "nat" se
prolonge automatiquement en une comparaison sur les types "big_int",
"ratio" et "num" qui est incorrecte...

Incorrecte ... ça dépend de ce que l'on veut en faire. Si c'est juste pour
obtenir un ordre total utilisable pour faire des Set.Make et Map.Make,
il n'y a pas de problème (et c'est ce que je veux faire). Je comprends que
ça serait un peu déroutant ...

Il se trouve que j'ai vraiment besoin de cela, parce que je construit des
structures complexes avec quelques big_int aux feuilles, et que ça serait
très lourd et très couteux de devoir refaire la descente recursive pour se
faire soit-même la comparaison.

Je ne trouve pas la licence exacte de la bibliothèque BigNum
(otherlibs/num/README fait référence à bignum/doc qui n'existe pas).
Quelles sont les possibilités pour diffuser une version modifiée
(j'aimerais éviter de devoir demander d'installer tout le source OCaml) ?

(Je pense que tu ne vas pas aimer la suggestion de faire une fonction
dans Arith_status pour activer ou désactiver les fonctions custom que
je propose ...)

La solution actuelle (faire une erreur) est donc préférable.

Je pense que ce serait assez facile d'implémenter une sorte de type
custom pour des valeurs Caml, histoire de pouvoir spécifier une fonction
de hash et de comparaison ... Je trouverais ça bien utile.

-- Alain

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant