J'ai trouvé quelque chose d'étrange.pow() comportement étrange comportement lorsqu'il est utilisé entre parenthèses et avec long entier entier
Cette fonction place un chiffre dans un nombre à l'endroit donné et renvoie le nombre modifié. Maintenant, nous voulons faire put_digit (123456789123456784, 0, 9); Cela mettra 9 à la fin du nombre, en remplaçant le dernier nombre (4).
Voici le code qui fonctionne:
long long int put_digit(long long int number, char place, char digit)
{
long long int result = number;
long long int power = number;
power = pow(10, (place));
result -= get_digit(number, place)*power;
result += digit*pow(10, (place));
return result;
}
Le code retourne 123456789123456789
Ceci est le code qui ne fonctionne pas:
long long int put_digit(long long int number, char place, char digit)
{
long long int result = number;
result -= get_digit(number, place)*pow(10, (place));
result += digit*pow(10, (place));
return result;
}
Ce code renvoie 123456789123456800 comme résultat.
Les fonctions get_digit() renvoie le chiffre du nombre à l'endroit donné. Ce est son code:
char get_digit(long long int number, char place)
{
long long int target = number;
char digit = 0;
target /= pow(10, place);
digit = target % 10;
return digit;
}
• Cela ne se produit pas avec des chiffres inférieurs.
• get_digit() renvoie toujours la valeur correcte (4 dans ce cas). • get_digit() est un caractère car il ne s'agit pas d'une fonction de compteur, il est donc préférable de se concentrer sur l'utilisation de moins de mémoire plutôt que d'utiliser une variable plus rapide comme int.
• J'ai essayé d'utiliser des parenthèses pour éviter la priorité gênante de l'opérateur, mais en vain.
• Un comportement bizarre est également observé lors de la commande put_digit (123456789123456000, 2, 7), qui renvoie 123456789123456704 pour une raison quelconque. Cette fonction est remplacée par la variable "power". Je ne comprends tout simplement pas pourquoi cela se produit.
Est-ce que je reçois un débordement? Est-ce la faute de mon système ou la mienne? Est-ce que j'utilise pow() dans un mauvais sens?
C11 projet n1570 standard, * 6.3.1.8 conversions arithmétiques habituelles 1 [...] Dans le cas contraire , si le type réel correspondant de l'un ou l'autre opérande est double, l'autre opérande est converti, sans changement de type domaine, en un type dont le type réel correspondant est double. * – EOF
Bon, corrigez-moi si je me trompe, mais le long nombre entier est converti en double jusqu'à ce que le calcul soit fait, puis subit une perte de précision en raison du grand nombre lorsqu'il est reconverti et affecté à la variable? –
Si vous attribuez 'long long x = pow (y, z);', le résultat de 'pow()', qui est de type 'double', est converti en' long long' par troncature. Si vous multipliez 'get_digit() * pow()', le résultat de 'get_digit()', qui est un 'char', est converti en' double'. De plus, l'assignation composée 'long long x - = (double) foo' convertit' x' en double, fait la soustraction et convertit le résultat en 'long long'. Pourquoi vous vous attendez à ce que le résultat soit le même est au-delà de moi. – EOF