Преобразование с плавающей точкой в ​​ANSI C - PullRequest
0 голосов
/ 16 ноября 2010

Учитывая следующий код ANSI C, мне интересно узнать о результатах:

main() {
  int a = 19.4 / 9.7;               // result = 2
  float b = (int) 19.4 / (int) 9.7  // result = 2.000000, why?
  float c = (int) 9.7;              // result = 9
}

Я понял, что C обрежет все десятичные знаки при преобразовании в int, но у моей логики есть недостаток, если я увижувторая линия.Если десятичные разряды были вырезаны, результат должен быть 2,11111.

Как выполняется преобразование с плавающей запятой в ANSI C?

Ответы [ 5 ]

4 голосов
/ 16 ноября 2010

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

Итак, 19/9 = 2

Затем, чтобы вывести это целое число в число с плавающей точкой, оно неявно преобразует 2 обратно в 2.000000

4 голосов
/ 16 ноября 2010

В стандартном C литералы, такие как 19.4 и 9.7, считаются двойными, если не указано иное (например, 19.4F, 9.7F).

Компилятор будет использовать функцию целочисленного деления для вычисления x/ y (если оба x и y имеют тип int (совместимый)) или функцию деления с плавающей запятой на компьютер x / y, если по крайней мере один из x и y является типом с плавающей запятой.

float b = (int) 19.4 / (int) 9.7 // result = 2.000000, почему?

Вы запрашиваете приведение 19.4 к int и 9.7 к int, эффективно запрашивая компилятор для вычисления целочисленного деления19/9 = 2, который затем повышается для хранения в б.2 становится 2,0.

.PMCD.

1 голос
/ 16 ноября 2010

(int) 19.4 / (int) 9.7 эквивалентно 19 / 9, которое сначала разрешается в 2 (целое число).Только после вычисления 2 он превращается в число с плавающей точкой по типу переменной.

1 голос
/ 16 ноября 2010

Разделите два целых числа, и вы получите целое число.Разделите число и целое число, и вы получите число.

1 голос
/ 16 ноября 2010

Нет, должно быть 2. Когда вы делите int на int, вы получаете int. Таким образом 2. Вы можете сделать hokey-pokey после этого, преобразовав его в то, что вам нравится, но десятичные дроби уже пропали.

...