Неявное приведение целочисленного вычисления для плавания в C ++ - PullRequest
2 голосов
/ 15 марта 2010

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

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"?

Ответы [ 4 ]

3 голосов
/ 15 марта 2010

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

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

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

2 голосов
/ 15 марта 2010

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

2 голосов
/ 15 марта 2010

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

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

1 голос
/ 15 марта 2010

Нет, эти два варианта самые лучшие.

...