Правильное использование констант в C - PullRequest
0 голосов
/ 20 декабря 2018

Я только что нашел ошибку в своем коде, которую можно упростить до:

float c;
int a,b;
a=5;b=6;
c=(a+b)/2;

В моей отладке c имеет значение 5, т.е. выполнено целочисленное деление.

Это приводит меняна вопрос: что является хорошей практикой при использовании чисел, которые не хранятся в переменной, то есть константе.В моем случае, знаменатель 2.

Когда я реализую математические формулы, которые содержат различные константы, как это, я должен всегда ставить .0 в конце, чтобы убедиться, что он используется внутрикак double?Это ускоряет время работы моей программы?Сколько дополнительной работы нужно проделать, если константу необходимо преобразовать из int в double?

формул, таких как

z = 180 * 3.1415 * x  + 5*y^2 - (10*x-y)/(y+x);

, где x, y,z являются двойными.

Итак, мой вопрос:

Это "чистый код", чтобы написать все факторы с .0 в конце?Это значительно снижает читабельность кода, особенно если формулы очень длинные.Но с этим соглашением я бы предотвратил ошибки, подобные той, что описана в начале.

Ответы [ 4 ]

0 голосов
/ 20 декабря 2018

Я делаю это так

float c;
int a,b;
a=5;b=6;
c=(float)(a+b)/2;

Просто приведите к тому, что вы ожидаете.То же самое с двойным.Таким образом вы избежите проблем с добавлением .0f и других материалов, а код останется чистым (читаемым).

float

#include<stdio.h>
int main(){
  double c;
  int a = 20,b = 3;
  c=(float)a/b;
  printf("c:%.10f\n",c);
  return 0;
}

Вывод:

c: 6,6666665077

double

#include<stdio.h>
int main(){
  double c;
  int a = 20,b = 3;
  c=(double)a/b;
  printf("c:%.10f\n",c);
  return 0;
}

Выход:

c: 6,6666666667

0 голосов
/ 20 декабря 2018

Когда я реализую математические формулы, которые содержат различные константы, подобные этой, должен ли я всегда ставить .0 в конце, чтобы убедиться, что он внутренне используется как двойное число?

Только есливам нужно убедиться, что результат равен double.Если вы хотите получить целочисленный результат, не добавляйте .0.Если вы хотите получить результат float, добавьте .0f.

0 голосов
/ 20 декабря 2018

Когда я реализую математические формулы, которые содержат различные константы, как это, я должен всегда ставить .0 в конце, чтобы убедиться, что он внутренне используется как двойной?

Где на самом делевы хотите, чтобы ваши константы имели тип double, тогда да, вы должны использовать одну из форм для констант этого типа.Там, где эти константы имеют нулевую дробную часть и выражаются без показателя степени, добавление .0 является хорошим способом привести их в такую ​​форму.

С другой стороны, нет, вы не должны слепо шлепать .0 на всех ваших константах.Как и в случае с переменными, вам нужно обратить внимание на то, какой тип вы хотите иметь для каждой константы.Используйте соответствующую форму.

Ускоряет ли это время работы моей программы?

Типы ваших констант могут влиять на правильность ofваша программа, как на самом деле была вашей отправной точкой.Где это так, относительные показатели не имеют значения.Независимо от того, как быстро вы это сделаете, это не поможет вам выполнить неправильные вычисления.С другой стороны, когда изменение от целочисленной константы до плавающей константы не влияет на правильность вычисления, это, вероятно, потому, что контекст, в котором появляется константа, требует преобразования в любом случае.В этом случае вполне вероятно, что компилятор просто вставляет константу преобразованного типа в первую очередь.В этом случае производительность среды выполнения не влияет.

Сколько нужно проделать дополнительную работу, если нужно преобразовать константу из int в удвоенную?

Обычно во время выполненияникто.Как явное, так и явное преобразование констант обычно выполняется во время компиляции, как обсуждалось выше.

Является ли это "чистым кодом" для записи всех факторов с ".0"в конце?

Если они все должны быть double с?Да, это чисто.И это может уберечь вас от неприятностей, если у вас возникнут трудности с запоминанием того, чтобы обращать внимание на типы констант.

Мне кажется, что я немного преувеличиваю, когда вижу код, который тщательно использует плавающие константы с целым числомзначения в контекстах, где неявное целочисленное преобразование с плавающей запятой в любом случае будет выполнено, но это правильный выбор, который служит разумной цели.

0 голосов
/ 20 декабря 2018

Константы имеют тип во время компиляции, так же как и переменные.Если числовая константа содержит десятичную точку и не содержит суффикса типа, тогда ее тип равен double.Если он не содержит десятичной точки и суффикса, это будет один из целочисленных типов (который зависит от значения константы и диапазона соответствующих типов).Так что нет никакого ускорения или замедления, связанного исключительно с типом константы.

Когда дело доходит до выполнения вычислений, целочисленная арифметика имеет тенденцию быть быстрее, чем с плавающей запятой, поэтому, как правило, не используйте значения с плавающей запятой, если вам не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...