LINUX.ORG.RU

float vs double на x86


0

0

Имеет ли смысл использовать float на x86 если точно известно что выполнение программы всегда происходит на аппаратном обеспечении, имеющем математический сопроцессор.

P.S. Компилятор - GCC :)

anonymous

ну это экономия памяти vs скорость и точность

как говорится выбирай сам

anonymous
()
Ответ на: комментарий от anonymous

Вот со скоростью как раз и вопрос. Где-то недавно на форуме читал, что GCC по умолчанию приводит float к double, выполняет вычисления, а потом производит обратное приведение...

anonymous
()
Ответ на: комментарий от anonymous

>Вот со скоростью как раз и вопрос. Где-то недавно на форуме читал, что GCC по >умолчанию приводит float к double, выполняет вычисления, а потом производит >обратное приведение...

объясняю по буквам float - это экономия памяти

double - это и скорость и точность.

> float к double, выполняет вычисления, а потом производит >обратное приведение

gcc и еще куча компиляторов так делает,
потому что по другому они и не могут делать,
т.к. i486 и выше с помощью сопроцессора поддерживают вычисления
с double но не поддерживают с float, поэтому при трансляции
кода приходиться перед тем как данные отправить сопроцессору для
вычисления приводить их в double.

по-моему P4 с sse поддерживает вычисления с float,
но точно не знаю

anonymous
()

Рекомендация специалиста-вычислителя: что в С, что в Фортране, что в Паскале НАСТОЯТЕЛЬНО РЕКОМЕНДУЕТСЯ хранить все результаты вычислений в формате с двойной точностью, т.е. double, double precision, double - соответственно. Если есть возможность использовать тип long double,и задача требует настолько высокой точности, то используется и он! Но он медленнее. А программу ускоряет грамотный код: вынос инвариантов из цикла, разбиение 1-го цикла на 2 более простых, если это возможно, использование целочисленной арифметики, замена операций деления (4,5 такта) на операцию умножения (1,8 такта - усредненых разумеется). Экономия же памяти за счет float сейчас малоактуальна.

popov_da
()
Ответ на: комментарий от popov_da

В теории - да, double вроде бы лучше, но на моем коде получилось +30% ускорения за счет перехода на float (g++ для Athlon'a). Да и у коллег аналогичные результаты, но на двухголовых Xeona'x

anonymous
()
Ответ на: комментарий от popov_da

> Экономия же памяти за счет float сейчас малоактуальна.

память медленная. Если ты нагрузку на нее снизишь в 2 раза разве она тебя не поблагодарит??

dilmah ★★★★★
()
Ответ на: комментарий от anonymous

Весь прикол в том, что если используется float, то вероятность того, что будет использована SIMD оптимизация, выше. Т.к. 3DNow, 3DNowEx - поддерживает операции над векторами из 2 *float* SSE - аналогично SSE2 - 4 float, 2 double.

И вообще почитайте мануалы типа AMD Athlon Optimazation Guide - там много чего интересного написано

anonymous
()
Ответ на: комментарий от anonymous

И еще совет: юзайте флажок -ffast-math (gcc)

anonymous
()
Ответ на: комментарий от anonymous

Это все верно, но при массивных вычислениях пользы маловато. Подобная оптимизация годится лишь тогда, когда Вы уже уверены в том, что точность вычислений не будет потеряна, или что не будет переполнения. Но тогда еще более оптимально использование целочисленных операций с необходимым масштабированием. Сейчас на современных платформах любая целочисленная операция выполняется за один такт. Да и нет необходимости выравнивать числа по старшему порядку - что снижает время работы и нагрузку на ЦПУ и ОЗУ.

popov_da
()
Ответ на: комментарий от anonymous

> т.к. i486 и выше с помощью сопроцессора поддерживают вычисления с double но не поддерживают с float,

Это как? sizeof(float)=4 Сопроцессоры x87 поддерживают 4-х байтовый вещественный тип.

anonymous_incognito ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.