2

Есть ли какой-либо компилятор, который имеет директиву или параметр для вычисления целочисленного вычисления для неявного размещения. Например:Неявное литье Целочисленное вычисление для float в C++

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

на "F" равен "0", так как константы расчета (1, 3, 10) являются целыми числами. Я хочу преобразовать целочисленный расчет с директивой или параметром компилятора. Я имею в виду, я не буду использовать явное приведение или «.f» префикс вроде этого:

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

или

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

Вы знаете, любой C/C++ компилятор, который имеет какой-либо параметр, чтобы сделать этот процесс без явного литья или «.f»?

+7

Вы бы изменили семантику базового языка, если бы смогли это сделать - обычно это не хорошая идея. Может быть, вы были бы более счастливы с совершенно другим языком программирования, который имеет семантику для выражений int/float, которые больше по вашему вкусу? –

+1

BTW: во втором случае только одна из констант '1' и' 3' должна быть плавающей. Другая константа и '5' будут автоматически продвигаться. Также вам не нужно определять, что они будут 'float', двойники будут неявно понижены до float:' float f = (1.0/3) * 5' сделает трюк (или '5.0/3'). –

+1

@David: «5 будет автоматически продвигаться», у меня создалось впечатление, что когда интегральные константы, меньшие, чем int, преобразуются в int, мы говорим, что они «продвигаются», но во всех остальных случаях мы просто говорим «конвертировано». –

ответ

1

Если вам не нравится какой-либо из двух методов, о которых вы упомянули, вам, вероятно, не повезло.

Что вы надеетесь достичь этим? Любой специализированный оператор, который сделал «float-division», должен был бы преобразовать ints в float в некоторый момент после токенизации, а это означает, что вы не получите какой-либо выгоды от производительности при выполнении.

+0

Спасибо за ответ, но речь идет не о симпатии или оскорблении. Наш проект огромен, и мы не заинтересованы ни в одной из целых операций. Мы можем делать ошибки обычно.Итак, мы должны запустить макрос, который преобразует целочисленные константы в константы с плавающей запятой (.f), после того как каждый код отправится в репозиторий. Если у нас есть компилятор, который выполняет эту работу вместо нас, мы можем исключить шаг (запуск макроса) для построения проекта. – Ziddiri

+1

@ Ziddiri - если вы действительно никогда в своем коде не нуждаетесь в целочисленной константе, я бы подумал, что было бы разумнее запустить эту проверку * до того, как она будет передана в репозиторий, а не потом. Отклонить код (или предупредить программиста), если он использует целые литералы. Конечно, большинство применений не являются вредными 'float f = 1; f + = 5; f = 1/f; '. Иногда бывает, что это неправильно, поэтому я вижу, что легко ошибаться, если вы просто не избегаете целочисленных литералов. Итак, последовательно напишите 'float f = 1.0; f + = 5,0; f = 1.0/f; ', а затем неправильный код, например' f * = (3/2); 'будет * выглядеть * неправильно. –

+3

В вашем проекте не используется один int? Даже не для петель? –

0

Нет, эти два варианта - это лучшее, что у вас есть.

2

В C++ немного странно видеть кучу числовых значений, посыпанных кодом. Как правило, считается лучшей практикой перемещать любые «магические числа», подобные этим, в их собственное значение static const float, которое устраняет эту проблему.

+0

Та же практика может и должна применяться к C#. – kenny

2

Любой компилятор, который сделал то, что вы хотите, больше не будет соответствовать C++-компилятору. Семантика целочисленного деления хорошо определена (по крайней мере, для положительных чисел), и вы предлагаете изменить это.

Это также было бы опасно, так как это привело бы к применению ко всему, и вы могли бы в какой-то момент иметь код, который полагается на стандартную целочисленную арифметику, которая молчаливо будет недействительной. (В конце концов, если бы у вас были тесты, которые могли бы поймать это, вы, вероятно, имели бы тесты, которые бы усваивали нежелательную целочисленную арифметику.)

Итак, единственный совет, который у меня есть, - это написать модульные тесты, и старайтесь избегать магических чисел (вместо этого определяя их как const float).