Почему c / c ++ типы с плавающей запятой так странно названы? - PullRequest
15 голосов
/ 30 декабря 2008

C ++ предлагает три типа с плавающей точкой: float, double и long double. Я редко использую плавающую точку в своем коде, но когда я это делаю, меня всегда ловят предупреждения на безобидных строках, таких как

float PiForSquares = 4.0;

Проблема в том, что литерал 4.0 - это двойное число, а не число с плавающей точкой - что раздражает.

Для целочисленных типов у нас есть короткие int, int и long int, что довольно просто. Почему C не имеет коротких, длинных и длинных? И откуда же взялся "двойник"?

РЕДАКТИРОВАТЬ: Кажется, что отношения между плавающими типами похожи на отношения целых чисел. double должен быть по крайней мере таким же большим, как float, а long double по крайней мере таким же большим, как double. Других гарантий точности / дальности не дано.

Ответы [ 12 ]

33 голосов
/ 30 декабря 2008

Термины «одинарная точность» и «двойная точность» появились в FORTRAN и уже широко использовались, когда был изобретен язык C. На станках начала 1970-х годов одинарная точность была значительно более эффективной и, как сегодня, использовала вдвое меньше памяти, чем двойная точность. Следовательно, это было разумное значение по умолчанию для чисел с плавающей запятой.

long double было добавлено гораздо позже , когда стандарт IEEE сделал допущение для чипа с плавающей запятой Intel 80287, который использовал 80-битные числа с плавающей запятой вместо классической 64-битной двойной точности.

Неправильно спрашивающий о гарантиях; сегодня почти все языки гарантируют реализацию двоичных чисел IEEE 754 с плавающей запятой с одинарной точностью (32 бита) и двойной точностью (64 бита). Некоторые также предлагают расширенную точность (80 бит), которая отображается в C как long double. Стандарт IEEE с плавающей точкой, возглавляемый Уильямом Каханом, был триумфом хорошей инженерии над целесообразностью: на машинах того времени он выглядел непомерно дорогим, но на современных машинах он очень дешев, а портативность и предсказуемость плавающих IEEE точечные цифры должны ежегодно экономить миллиарды долларов.

24 голосов
/ 30 декабря 2008

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

 float f = 4.0f;
 long double f = 4.0l;

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

Почему наименование? Однажды у нас были только 32-битные числа с плавающей запятой (ну, на самом деле все, что у нас было, это числа с фиксированной запятой, но я отвлекся). В любом случае, когда с плавающей точкой стало популярной особенностью в современных архитектурах, C, вероятно, был языком dujour, и было дано имя «float». Казалось бы, имеет смысл.

В то время о двоичном коде можно было подумать, но он не был реализован в процессоре / fp процессора того времени, который был 16 или 32 бита. Как только двойник стал использоваться в большем количестве архитектур, С, вероятно, нашел время добавить его. C нужно что-то имя для чего-то вдвое большего размера, поэтому мы получили двойное. Тогда кому-то понадобилась еще большая точность, мы думали, что он сошел с ума. Мы все равно добавили это. Название четверки (?) Было излишним. Длинный дубль был достаточно хорош, и никто не делал много шума.

Частично путаница заключается в том, что доброе ол "int", кажется, меняется со временем. Раньше, что «int» означало 16-битное целое число. Однако число с плавающей точкой привязано к IEEE std как 32-разрядное число с плавающей точкой IEEE. По этой причине C оставил число с плавающей точкой, определенное как 32-битное, и сделал double и long double, чтобы ссылаться на более длинные стандарты.

4 голосов
/ 30 декабря 2008

литералы

Проблема в том, что литерал 4.0 - это двойное число, а не число с плавающей точкой - что раздражает.

С константами есть одно важное различие между целыми числами и числами с плавающей точкой. Хотя относительно легко решить, какой тип целочисленного типа использовать (вы выбираете наименьший размер для хранения значения, с некоторой дополнительной сложностью для подписанного / неподписанного), с плавающими не все так просто. Многие значения (в том числе простые, такие как 0,1) не могут быть точно представлены числами с плавающей запятой, и поэтому выбор типа влияет не только на производительность, но и на значение результата. Похоже, что разработчики языка C предпочли устойчивость к производительности в этом случае, и поэтому они решили, что представление по умолчанию должно быть более точным.

История

Почему C не имеет коротких, длинных и длинных? И откуда же взялся «двойник»?

Термины «одинарная точность» и «двойная точность» возникли в Фортране и уже широко использовались, когда был изобретен С.

2 голосов
/ 30 декабря 2008

Во-первых, эти имена не являются специфическими для C ++, но являются довольно распространенной практикой для любого типа данных с плавающей точкой, который реализует IEEE 754.

Название «double» относится к «двойной точности», а float часто называют «одинарной точностью».

1 голос
/ 02 февраля 2009

Их называют одинарной и двойной точностью, потому что они связаны с естественным размером (не уверенным в терминах) процессора. Таким образом, 32-разрядный процессор с одинарной точностью будет иметь длину 32 бита, а его двойная точность будет вдвое больше - длина 64 бита. Они просто решили назвать тип с плавающей точкой одинарной точности в C.

1 голос
/ 30 декабря 2008

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

В K & R C float относится к представлениям с плавающей запятой с 32-битными двоичными представлениями, а double относится к представлениям с плавающей запятой с 64-битными двоичными представлениями, или удваивает размер и откуда имя. Однако оригинальная спецификация K & R требовала, чтобы все вычисления с плавающей точкой выполнялись с двойной точностью.

В первоначальном стандарте IEEE 754 (IEEE 754-1985), золотом стандарте для представлений с плавающей точкой и арифметики, были предусмотрены определения для двоичных представлений чисел с плавающей точкой одинарной и двойной точности. Числа двойной точности были названы удачно, так как они были представлены в два раза больше битов, чем числа одинарной точности.

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

1 голос
/ 30 декабря 2008

Двойник назван так, потому что он удваивает «точность» поплавка. На самом деле это означает, что он использует вдвое больше пространства значения с плавающей запятой - если ваш тип с плавающей запятой 32-битный, то ваш тип double будет 64-битным.

Название двойной точности немного ошибочно, поскольку число с плавающей запятой двойной точности имеет точность мантиссы в 52 бита, в то время как число с плавающей запятой одинарной точности имеет точность мантиссы в 23 бита (двойное число, равное 56). Подробнее о плавающей точке здесь: Плавающая точка - Википедия , в том числе ссылки внизу на статьи о поплавках одинарной и двойной точности.

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

1 голос
/ 30 декабря 2008

В двух наиболее распространенных форматах с плавающей запятой используются 32-битные и 64-битные, чем длиннее «двойной» размер первого, тем больше он назывался «double».

0 голосов
/ 02 февраля 2009

, следовательно,% f для типа с плавающей запятой и% lf для длинного с плавающей запятой, равного double.

0 голосов
/ 30 декабря 2008

Следует отметить, что double НЕ ДОЛЖНО иметь возможность хранить значения, большие по величине, чем значения float; он должен быть точнее .

...