Вопрос

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

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

Это было полезно?

Решение

В большинстве настольных приложений - да.

Хотя, если у вас их огромный массив, уменьшение вдвое его размера может быть достаточно значительным, чтобы иметь смысл, если вам не нужна точность.

Особенно учитывая, что практически все потребительские настольные компьютеры имеют аппаратную арифметику с плавающей запятой двойной точности.

Другие советы

От это статья .net

Ширина типа данных

Наиболее эффективными типами данных являются те, которые используют ширину собственных данных платформы времени выполнения.На текущих платформах ширина данных составляет 32 бита, как для компьютера, так и для операционной системы.

Следовательно, Integer в настоящее время является наиболее эффективным типом данных в Visual Basic .NET.Следующими по эффективности являются Long, Short, и Byte.Вы можете повысить производительность Short и Byte, отключив целочисленную проверку переполнения, например, установив RemoveIntegerChecks свойство, но это сопряжено с риском неправильных вычислений из-за необнаруженных переполнений.Вы не можете включать и выключать эту проверку во время выполнения;вы можете установить его значение только для следующей сборки вашего приложения.

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

Как говорит Марк в своем комментарии, пространство может быть проблемой в системах с ограниченной памятью.Вы также можете захотеть проиндексировать или отсортировать список, но зачем делать это в двойном списке, если вы можете хранить свои значения в одиночном?

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

Тем не менее, в дополнение к причинам "использует меньше памяти", изложенным в других ответах, есть очень практическая причина, когда дело доходит до векторных инструкций SIMD, таких как SSE и AltiVec - одинарная точность, как правило, в два раза быстрее, чем двойная точность, поскольку инструкции работают с векторами фиксированного размера, и вы можете поместить в один вектор вдвое больше значений одинарной точности, при этом время обработки обычно остается неизменным.

Например, с 128-битным векторным модулем, способным обрабатывать векторные умножения за 2 такта, вы могли бы получить пропускную способность в 2 умножения с одинарной точностью за такт по сравнению с 1 умножением с двойной точностью, поскольку вы можете выполнять 4 одиночных умножения в векторе по сравнению с двумя двойными.

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

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

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

К сожалению, вычислительная техника по-прежнему остается экспериментальной наукой.

Если вы кодируете OpenGL, то обычно использовать GLSingle (например, single), а не GLdouble.Почти во всех случаях одинарной точности более чем достаточно для большинства графических приложений, и она должна быть быстрее - хотя, признаюсь, я не уверен в этом на графических процессорах последнего поколения.

Моя любимая цитата по этому поводу заключается в том, что единичной точности было достаточно для полета на Луну и обратно, поэтому на практике это необычно - вызывать реальную проблему.Тем не менее, в большинстве случаев в настоящее время я бы предпочел удвоение, поскольку хранилище дешевое, и меньше вероятности возникновения каких-либо нечетных двоично-десятичных проблем.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top