2

Existe-t-il un compilateur qui ait une directive ou un paramètre pour lancer le calcul d'entier pour flotter implicitement. Par exemple:Coulée implicite Calcul de l'entier pour flotter en C++

float f = (1/3)*5; 
cout << f; 

le "f" est "0", parce que les constantes de calcul (1, 3, 10) sont des nombres entiers. Je veux convertir le calcul d'entier avec une directive ou un paramètre de compilateur. Je veux dire, je ne vais pas utiliser la coulée explicite ou préfixe « .F » comme ça:

float f = ((float)1/3)*5; 

ou

float f = (1.0f/3.0f)*5.0f; 

Connaissez-vous c/C++ compilateur qui a un paramètre pour faire de ce processus sans casting explicite ou ".f" chose?

+7

Vous modifieriez la sémantique du langage sous-jacent si vous pouviez le faire - ce n'est généralement pas une bonne idée. Peut-être que vous seriez plus heureux avec un langage de programmation complètement différent qui a une sémantique pour les expressions int/float qui sont plus à votre goût? –

+1

BTW: dans le second cas, une seule des constantes '1' et' 3' doit être flottante. L'autre constante et le '5' seront automatiquement promus. De plus, vous n'avez pas besoin de les définir pour être 'float', les doubles seront implicitement rétrogradés à float:' float f = (1.0/3) * 5' fera l'affaire (ou '5.0/3'). –

+1

@David: "le 5 va automatiquement promouvoir", j'avais l'impression que lorsque les constantes intégrales plus petites que int sont converties en int alors on dit qu'elles sont "promues", mais dans tous les autres cas on dit simplement "converti". –

Répondre

1

Si vous n'aimez pas l'une des deux méthodes que vous avez mentionnées, vous n'avez probablement pas de chance.

Qu'espérez-vous accomplir avec ceci? N'importe quel opérateur spécialisé qui a fait "float-division" devrait convertir des ints en floats à un moment donné après la tokenization, ce qui signifie que vous n'obtiendrez aucun gain de performance sur l'exécution.

+0

Merci pour la réponse, mais il ne s'agit pas d'aimer ou de ne pas aimer le problème. Notre projet est énorme et nous n'avons aucun intérêt dans les opérations entières. Nous pouvons faire des erreurs usuellement.Nous devons donc exécuter une macro qui convertit les constantes entières en constantes flottantes (.f), après chaque soumission de code au référentiel. Si nous avons un compilateur qui fait ce travail à la place de nous, nous pouvons éliminer une étape (l'exécution de la macro) de construction du projet. – Ziddiri

+1

@Ziddiri - Si vous n'avez jamais vraiment besoin d'une constante entière dans votre code, j'aurais pensé qu'il serait plus logique d'exécuter cette vérification * avant * de commettre dans le dépôt, pas après. Rejeter le code (ou avertir le programmeur) s'il utilise des littéraux entiers. Bien sûr, la plupart des utilisations ne sont pas dangereuses 'float f = 1; f + = 5; f = 1/f; C'est juste parfois que c'est faux, donc je vois qu'il est facile de faire des erreurs à moins d'éviter les littéraux entiers. Donc, écrivez toujours 'float f = 1.0; f + = 5,0; f = 1.0/f; ', puis un mauvais code comme' f * = (3/2); 'sera * faux *. –

+3

Votre projet n'utilise pas un seul int? Pas même dans les boucles? –

0

Non, ces deux options sont les meilleures que vous ayez.

2

En C++, c'est un peu bizarre de voir un tas de valeurs numériques saupoudrées dans le code. Généralement, il est considéré comme la meilleure pratique de déplacer tous les «nombres magiques» comme ceux-ci vers leur propre valeur flottante const statique, ce qui élimine ce problème.

+0

La même pratique pourrait et devrait être appliquée à C#. – kenny

2

Tout compilateur qui a fait ce que vous voulez ne serait plus un compilateur C++ conforme. La sémantique de la division entière est bien spécifiée (au moins pour les nombres positifs), et vous proposez de changer cela.

Il serait également dangereux car il finirait par s'appliquer à tout, et vous pourriez avoir à un moment donné du code qui repose sur l'arithmétique des nombres entiers, qui serait silencieusement invalide. (Après tout, si vous aviez des tests qui attraperaient cela, vous auriez probablement des tests qui attraperaient l'arithmétique entière non désirée.)

Donc, le seul conseil que j'ai est d'écrire des tests unitaires, avoir des critiques de code, et essayez d'éviter les nombres magiques (au lieu de les définir comme const float).