Notez que ce n'est pas la norme, car il s'appuie sur wrap-around signé de dépassement de capacité. (GCC a les drapeaux de compilation qui permettent à ce sujet).
Mais si vous venez de faire tous les calculs en long long
, le résultat de l'application de la formule directement:
(A * B - C * D)
seront exacts tant que le bon résultat s'inscrit dans un long long
.
Voici un travail qui ne repose que sur la mise en œuvre définies par le comportement de casting entier non signé entier signé. Mais ce peut être prévu pour fonctionner sur presque tous les systèmes d'aujourd'hui.
(long long)((unsigned long long)A * B - (unsigned long long)C * D)
Ce qui jette les entrées unsigned long long
où le dépassement de comportement est garanti pour être wrap-around par la norme. Casting de retour d'un entier signé à la fin est la mise en œuvre définies par le cadre, mais les travaux sur presque tous les environnements d'aujourd'hui.
Si vous avez besoin de plus pédant solution, je pense que vous devez utiliser le "long de l'arithmétique"