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

Старый вопрос, но я хотел бы просто добавить специальный случай, когда вы не хотите печатать весь стек, удалив некоторые части, на которых вас фактически не интересуют, исключая определенные классы или пакеты.

Вместо PrintWriter используйте SelectivePrintWriter:

// This filters out this package and up.
String packageNameToFilter = "org.springframework";

StringWriter sw = new StringWriter();
PrintWriter pw = new SelectivePrintWriter(sw, packageNameToFilter);
e.printStackTrace(pw);
String sStackTrace = sw.toString(); 
System.out.println(sStackTrace);

, где класс SelectivePrintWriter задается:

public class SelectivePrintWriter extends PrintWriter {
    private boolean on = true;
    private static final String AT = "\tat";
    private String internal;

    public SelectivePrintWriter(Writer out, String packageOrClassName) {
        super(out);
        internal = "\tat " + packageOrClassName;
    }

    public void println(Object obj) {
        if (obj instanceof String) {
            String txt = (String) obj;
            if (!txt.startsWith(AT)) on = true;
            else if (txt.startsWith(internal)) on = false;
            if (on) super.println(txt);
        } else {
            super.println(obj);
        }
    }
}

Пожалуйста обратите внимание, что этот класс может быть легко адаптирован для фильтрации с помощью Regex, contains или других критериев. Также обратите внимание, что это зависит от деталей реализации Throwable (вряд ли изменится, но все же).

15
задан 5 revs, 2 users 100% 24 August 2009 в 11:56
поделиться

12 ответов

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

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

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

33
ответ дан 30 November 2019 в 23:56
поделиться

Хорошо, исторически вот способ, которым это раньше было:

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

был некоторый беспорядок, который успокоился в компиляторах Беркли так, чтобы короткими были теперь 2 байта, и интервал составлял 4 байта, поскольку это было подходящим к эффективному коду. Длинное стало 8 байтами, потому что был эффективный метод обращения для 8-байтовых блоков---, которые назвали двойные слова . 4-байтовые блоки были слова и верный enugh, 2-байтовые блоки были полуслова .

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

0
ответ дан 30 November 2019 в 23:56
поделиться

следовательно %f для типа плавающего и %lf для долгого плавания, которое совпадает с дважды.

0
ответ дан 30 November 2019 в 23:56
поделиться

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

0
ответ дан 30 November 2019 в 23:56
поделиться

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

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

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

Для получения дальнейшей информации на представлениях с плавающей точкой, считайте David Goldberg статья , , Что Каждый Программист Должен Знать Об Арифметике С плавающей точкой .

1
ответ дан 30 November 2019 в 23:56
поделиться

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

1
ответ дан 30 November 2019 в 23:56
поделиться

Литералы

проблема состоит в том, что литеральные 4.0 являются двойным, не плаванием - Который является раздражающим.

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

История

, Почему не делает C просто, имеет короткое плавание, и долгое плавание плавающее? И где на земле действительно "удваивался", прибывают из?

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

4
ответ дан 30 November 2019 в 23:56
поделиться

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

0
ответ дан 30 November 2019 в 23:56
поделиться

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

1
ответ дан 30 November 2019 в 23:56
поделиться

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

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

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

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

В то время, дважды, возможно, думался, но не действительно реализовывался в cpu's/fp CPU времени, которые составляли 16 или 32 бита. После того как двойное привыкло в большем количестве архитектуры, C, вероятно, нашел время для добавления его. C было нужно что-то название чего-то дважды размер плавания, следовательно мы получили двойное. Затем кому-то было нужно еще больше точности, мы думали, что он был сумасшедшим. Мы добавили его так или иначе. Имя quadtuple(?) было излишеством. Долго дважды было достаточно хорошо, и никто не сделал много шума.

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

24
ответ дан 30 November 2019 в 23:56
поделиться

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

, который имя 'дважды' отсылает к 'двойной точности', в то время как плавание, как часто говорят, является 'одинарной точностью'.

2
ответ дан 30 November 2019 в 23:56
поделиться

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

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

имя долго удваивается, вероятно, просто снижается на ту же традицию как длинное целое по сравнению с коротким целым для целочисленных типов, кроме этого случая, они инвертировали его, так как 'интервал' эквивалентен 'длинному целому'.

1
ответ дан 30 November 2019 в 23:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: