Приведите возвращаемое значение функции, которая возвращает тип с плавающей точкой - PullRequest
2 голосов
/ 15 февраля 2010

Мне сложно понять статью Привести возвращаемое значение функции, которая возвращает тип с плавающей запятой

(1) В

Преобразование как при присваивании типу функции требуется, если возвращаемое выражение имеет тип, отличный от функции, но не если возвращаемое выражение имеет более широкое значение только из-за широкой оценки.

Что такое "широкая оценка"? Что оно пытается сказать?

(2) в примере

float f(float x) {  
  return x * 0.1f;  
}  

float g(float x) {  
  return x * 0.1;  
}  

Почему «Функция f может возвращать значение шире, чем float, а функция g (которая использует более широкую константу) - нет»?

В f () x и 0.1f оба имеют тип float, поэтому я думаю, что x * 0.1f также является типом float? В g () 0,1, вероятно, рассматривается как двойной, так что x * 0,1 является двойным?

(3) Какая мораль у статьи?

Спасибо и всего наилучшего!

Ответы [ 2 ]

2 голосов
/ 15 февраля 2010

Функция g возвращает тип float, который является 32-битным значением. 0.1 интерпретируется как double, что означает, что выражение x * 0.1 возвращает double. Двойное число - это 64-битное значение, которое приведет к сужающему преобразованию, которое будет возвращено как число с плавающей запятой. x можно безопасно преобразовать в double, потому что это расширяющее преобразование из float в double.

1 голос
/ 16 февраля 2010

(1) В

Conversion as if by assignment to the type of the function is required

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

Что такое "широкая оценка"? Что значит это пытаться сказать?

Если вы объявите байтовую переменную или константу, она может быть сохранена как DWORD на 32-битной платформе. Байтовая арифметика также может быть реализована как 32-битная арифметика (широкая оценка). Это не вызывает проблем для целочисленных типов.

(2) в примере

float f (float x) {return x * 0.1f; }

float g (float x) {return x * 0.1; }

Почему "функция f может возвращать значение шире, чем float, но функция g (который использует более широкую константу) не "?

Это то, что говорит текущий стандарт C: 0,1f может храниться в более широком формате (чем с плавающей запятой), x * 0,1f также может оцениваться в более широком формате, и оператор return не требуется для выполнения преобразования в float и может вернуть результат "как есть". С помощью функции g оператор возврата должен выполнять преобразование из double в float.

В f () x и 0.1f имеют тип float так что я думаю x * 0.1f тоже float тип? В g () вероятно рассматривается 0,1 как двойной, так что х * 0,1 является двойной?

Да, это верно для всех 32-битных компиляторов (по крайней мере, я так думаю :)). Но статья посвящена проблеме в целом.

(3) Какая мораль статья

Стандарт C труден для изучения:)

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