Почему типы с плавающей запятой c/С++ так странно называются?

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

float PiForSquares = 4.0;

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

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

Вы, наверное, знали это, но можете делать литеральные поплавки/длинные удвоения

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

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

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

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

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

Ответ 3

литералов

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

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

История

Почему C не имеет коротких float, float и long float? И где же произошло "двойное"?

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

Ответ 4

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

Имя "double" относится к "двойной точности", в то время как float часто называют "единственной точностью".

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

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

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

Хорошо, исторически здесь так оно и было:

Исходные машины, используемые для C, имели 16-битные слова, разбитые на 2 байта, а char - один байт. Адреса были 16 бит, поэтому sizeof(foo*) равно 2, sizeof(char) равно 1. Инт был 16 бит, поэтому sizeof(int) также было 2. Затем появились машины VAX (расширенной адресации), а адрес был 32 бита. A char был еще 1 байт, но sizeof(foo*) теперь 4.

Возникла некоторая путаница, которая уселась в компиляторах Berkeley, так что короткий был теперь 2 байта, а int был 4 байта, поскольку они были хорошо подходят для эффективного кода. Длинный стал 8 байтами, потому что был эффективный метод адресации для 8-байтовых блоков, которые назывались двойными словами. 4 байтовых блока были словами и уверенными, 2-байтовые блоки были полусловами.

Реализация чисел с плавающей запятой была такой, что они вписывались в отдельные слова или двойные слова. Чтобы оставаться последовательным, число с плавающей запятой двойного слова было тогда названо "двойным".

Ответ 11

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

Ответ 12

следовательно,% f для типа float и a% lf для длинного float, который является таким же, как double.