The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Использование NaN, inf как маркеров инициализации переменных"
Отправлено аноним, 13-Окт-09 19:58 
>Использование float и double в коде ведет к существенному замедлению работы программы.
>И когда нужна скорость выполнение применять не  следует.

Вообще-то, наоборот. Вот простой alpha blend.

#include <stdio.h>
#include <stdlib.h>
#include <sys/limits.h>
#include <sys/types.h>

#define SIZE    1024*1024
#define ITERS   512

#if defined FLOAT
# define TYPE float
#elif defined DOUBLE
# define TYPE double
#elif defined SHORT
# define TYPE unsigned short
# define MAX USHRT_MAX
#elif defined INT
# define TYPE unsigned int
# define MAX UINT_MAX
#else
#error please define FLOAT, DOUBLE, SHORT or INT
#endif

int main() {
        int i,j;
        srand(234234234);

        TYPE color1[SIZE];
        TYPE color2[SIZE];
        TYPE alpha[SIZE];
        TYPE output[SIZE];

        for (i = 0; i < SIZE; ++i) {
#if defined(FLOAT) || defined(DOUBLE)
                color1[i] = (float)rand()/(float)RAND_MAX;
                color2[i] = (float)rand()/(float)RAND_MAX;
                alpha[i] = (float)rand()/(float)RAND_MAX;
#else
                color1[i] = MAX*(float)rand()/(float)RAND_MAX;
                color2[i] = MAX*(float)rand()/(float)RAND_MAX;
                alpha[i] = MAX*(float)rand()/(float)RAND_MAX;
#endif
        }

        for (j = 0; j < ITERS; ++j)
                for (i = 0; i < SIZE; ++i)
#if defined(FLOAT) || defined(DOUBLE)
                        output[i] = (color1[i]*alpha[i] + color2[i]*(1-alpha[i]));
#elif defined(INT)
                        output[i] = ((uint64_t)color1[i]*alpha[i] + (uint64_t)color2[i]*(MAX-alpha[i]))/MAX;
#else
                        output[i] = (color1[i]*alpha[i] + color2[i]*(MAX-alpha[i]))/MAX;
#endif

#if defined(FLOAT) || defined(DOUBLE)
        printf("blend(%.4f, %.4f, %.4f) = %.4f\n", color1[0], color2[0], alpha[0], output[0]);
#else
        printf("blend(%.4f, %.4f, %.4f) = %.4f\n",
                        (float)color1[0]/(float)MAX,
                        (float)color2[0]/(float)MAX,
                        (float)alpha[0]/(float)MAX,
                        (float)output[0]/(float)MAX);
#endif

        return 0;
}

Вот так оно работает на 64bit машине. Как видите float всех рвет. Не буду приводить результат на 32бин машине, ибо 64бит арифметика убивает там все вообще нахрен (а без нее будем терять точность).

% make test
cc -O2 test.c -DFLOAT -o float
cc -O2 test.c -DDOUBLE -o double
cc -O2 test.c -DSHORT -o short
cc -O2 test.c -DINT -o int
time ./float
blend(0.2036, 0.0478, 0.8507) = 0.1803
        1,87 real         1,87 user         0,00 sys
time ./double
blend(0.2036, 0.0478, 0.8507) = 0.1803
        3,74 real         3,68 user         0,02 sys
time ./short
blend(0.2036, 0.0478, 0.8507) = 0.1803
        2,03 real         2,03 user         0,00 sys
time ./int
blend(0.2036, 0.0478, 0.8507) = 0.1803
        2,20 real         2,15 user         0,03 sys

> P.S. да и вобше формат float бесполезный, всегда обходился без него.
>всего 6 значаших чисел, абсолютной точности нет , а 6 разрядов
>можно и через int обрабатывать .

Да и вообще, вы ламер, хотя бы из-за категоричности высказываний и из-за бреда с 6 значащими числами (что вы вообще в виду имели?). Для любой задачи почти всегда можно точно сказать, что лучше использовать - float, fixed point или свою реализацию с произвольной точностью.

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.

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



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру