balisage Stackoverflow ne supporte pas la notation mathématique bien, et la plupart des lecteurs de ce sera programmeurs, donc je vais utiliser la syntaxe d'expression de programmation commune:
* multiplication
^ exponentiation
/division
x[i] Element i of an array x
== equality
PROD product
Cette traite de la question de savoir si, étant donné un radix r
terminant fraction a/(r^n)
, il y a une terminaison radix s
fraction b/(s^m)
avec exactement la même valeur, a
, b
entiers, r
et s
des nombres entiers positifs, et n
m
intege non négatif rs.
a/(r^n)==b/(s^m)
est équivalent à b==a*(s^m)/(r^n)
. a/(r^n)
est exactement égale à une certaine fraction de terminaison s
si, et seulement si, il existe un entier positif m
tel que a*(s^m)/(r^n)
est un nombre entier. Considérons la factorisation première de r
, PROD(p[i]^k[i])
Si, pour certains i
, p[i]^k[i]
est un terme dans la factorisation première de r
, alors p[i]^(n*k[i])
est un terme dans la factorisation première de r^n
.
a*(s^m)/(r^n)
est un entier si, et seulement si, tous les p[i]^(n*k[i])
dans la factorisation de r^n
est aussi un facteur de a*(s^m)
premier suppose p[i]
est également un facteur de s
. Ensuite, pour m
suffisamment grand, p[i]^(n*k[i])
est un facteur de s^m
.
Supposons maintenant p[i]
n'est pas un facteur de s
. p[i]^(n*k[i])
est un facteur de a*(s^m)
si, et seulement si, c'est un facteur de a
.
La condition nécessaire et suffisante pour l'existence d'un nombre entier non négatif m
de telle sorte que b==a*(s^m)/(r^n)
est un nombre entier est que, pour chaque p[i]^k[i]
dans la factorisation de r
, soit p[i]
est un facteur de s
ou p[i]^(n*k[i])
est un facteur de a
.
Appliqué à l'affaire commune de r=10
et s=2
, la factorisation de r
est (2^1)*(5^1)
. 2 est un facteur de 2, donc nous pouvons l'ignorer. 5 n'est pas, nous avons donc besoin de 5^n
pour être un facteur de a
.
Tenir compte des cas particuliers:
décimal 0.1
est 1/10
, 5 n'est pas facteur de 1, donc il n'y a pas d'équivalent de fraction binaire exacte.
Décimal 0.625
, 625/(10^3)
. 5^3
est 125, ce qui est un facteur de 625, donc il y a un équivalent exact de la fraction binaire. (C'est binaire 0.101).
La méthode dans la réponse référencée https://stackoverflow.com/a/489870/5712298 est équivalente à celle-ci pour décimal à binaire. Il faudrait un peu de travail pour étendre au cas général, pour tenir compte des facteurs premiers dont l'exposant n'est pas 1.
La réponse que vous avez liée détermine si une valeur décimale peut être représentée exactement dans _binary-virgule flottante, bien que la réponse indique simplement _binary_, qui en soi est ambigu. En tant que tel, le titre de votre question doit peut-être changer, il est très spécifique aux représentations de point flottant plutôt que simplement "_a base_". – Clifford
Je pense qu'il y a une erreur dans la description de la méthode sur le lien, voir mon commentaire ajouté. – Clifford