Требуется ли преобразование реального числа с плавающей точкой в целое число, чтобы значение было усечено до нуля, чтобы облегчить перенос кода с Фортрана на C?
C11, 6.3.1.4 Действительное число с плавающей запятой и целое число:
Когда конечное значение реального плавающего типа преобразуется в целочисленный тип, отличный от _Bool, дробная часть отбрасывается (т. Е. Значение обрезается до нуля).
Каково обоснование «значение усечено до нуля»? Почему, например, не «округляется до ближайшего целого значения, а половинные случаи округляются до четного» (IEEE 754,
convertToIntegerTiesToEven(x)
)?
Из документа «Обоснование международного стандарта - языки программирования - C», редакция 5.10, апрель 2003 г .:
6.3.1.5 Реальные плавающие типы (выделено автором):
Поскольку усечение в сторону нуля является подходящей настройкой для C в первом случае, было бы дорого требовать, чтобы такие реализации округляли до с плавающей точкой.
6.5.5 Мультипликативные операторы (выделено автором):
В C89 деление целых чисел с использованием отрицательных операндов может округляться в большую или меньшую сторону способом, определяемым реализацией; намерение состояло в том, чтобы избежать накладных расходов в коде времени выполнения для проверки 10 особых случаев и обеспечения определенного поведения. В Фортране, однако, результат всегда будет усекаться до нуля , и накладные расходы кажутся приемлемыми для сообщества числовых программистов. Таким образом, C99 теперь требует подобного поведения, которое должно облегчить перенос кода из Fortran на C.
2 ответа
Ответ на ваш вопрос находится в абзаце перед тем, который вы процитировали. 6.3.1.4 гласит: «Хотя K&R допускает усечение отрицательных плавающих значений от нуля, ни один член комитета C89 не знал о реализации, которая работала бы таким образом». То есть каждая известная реализация C усекала значения с плавающей запятой до нуля, так что это было сделано стандартом (поскольку это обеспечивает единообразие в будущем).
В первом издании K&R на странице 42 говорится: «…
Вот и все. K&R предусматривал «усечение» либо в сторону нуля, либо, по сути, в сторону −∞. Комитет C обнаружил, что никто не занимается вторым, поэтому они приняли первое. Если вы хотите узнать больше, вам нужно будет спросить Брайана Кернигана или поищите это в их трудах.
Самый простой - обычно лучший .
В 1970-х годах, как и сегодня, было много режимов округления и различных преимуществ . C искал компромисс, основанный на существующей практике. Поскольку в то время режимы округления не были такими единообразными в отрасли (IMO, они до сих пор нет), был задан простейший вариант - усечение.
Спецификации IEEE 754 (1980-е) пришли после C (1970-е). Стандарт IEEE 754 предлагает руководство сегодня, но не получил широкого распространения в первые дни C. У разных производителей были свои предпочтительные решения.
Я подозреваю, идея что@Eric «обеспечивает единообразие в будущем» тоже была ключевым фактором.