Кастинг в смешанных типах расчетов в C? - PullRequest
3 голосов
/ 18 апреля 2010

Если я определю эти переменные:

double x0, xn, h;
int n;

и у меня есть это математическое выражение:

h = (xn - x0)/n;

Нужно ли мне приводить n в двойное число перед выполнением деления для максимальной точности, как в

h = (xn - x0)/ (double) n;

Я написал программу для проверки вышеуказанного, но оба выражения дают одинаковые ответы. Я понимаю, что C будет продвигать целочисленное значение типа double, поскольку переменные xn и x0 имеют тип double, но, как ни странно, в книге было подчеркнуто второе выражение с приведением типа.

Мой вопрос был бы, если я правильно думаю.

Большое спасибо ...

Ответы [ 4 ]

3 голосов
/ 18 апреля 2010

Ваше понимание верно, и книга, которую вы читаете, либо ошибочна, либо слишком осторожна (например, люди, которые утверждают, что вы всегда должны проверять 0 == x вместо x == 0). Выражение без приведения всегда должно давать точно такой же результат, как выражение с приведениями.

2 голосов
/ 18 апреля 2010

Нет, это преобразование не требуется, поскольку числитель имеет значение double. Это также повышает n до double. Книга, вероятно, упоминает явное приведение как хорошую привычку, потому что если бы xn и x0 были int с, то выражение использовало бы только целочисленное деление.

1 голос
/ 18 апреля 2010

В C точность любого выражения совпадает с константой / переменной наивысшей точности, участвующей в выражении.

Явные приведения полезны:

  • В качестве меры предосторожности .

Завтра вы можете редактировать переменные в выражение для использования целых. В ролях все равно вернет правильное значение

  • В качестве руководства .

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

т.е. «Пусть код Ур будет его собственным комментарием !!»

1 голос
/ 18 апреля 2010

Это не нужно в этой ситуации. Обычно это требуется в ситуациях, когда вы хотите получить результат, отличающийся по типу от операндов. Типичным является время выполнения. Вы часто получаете код, подобный следующему: double(end_time-start_time)/CLOCKS_PER_SEC; В этом случае приведение действительно необходимо, поскольку все входные данные (обычно) являются целочисленными типами, но вы хотите получить результат с плавающей точкой.

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