На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Ах как я зол!
    int main(int argc, char* argv[])
    {
    float t = 0.5/6.0;
    float t1;
    float t2;
    __asm
    {
    movss xmm0,t
    addss xmm0,t
    addss xmm0,t
    addss xmm0,t
    addss xmm0,t
    addss xmm0,t
    addss xmm0,t
    addss xmm0,t
    addss xmm0,t
    addss xmm0,t
    addss xmm0,t
    addss xmm0,t
    movss t1,xmm0
    }
    __asm
    {
    fld t
    fadd t
    fadd t
    fadd t
    fadd t
    fadd t
    fadd t
    fadd t
    fadd t
    fadd t
    fadd t
    fadd t
    fst t2
    }

    printf("SSE result = \%.30f\n",t1);
    printf("FPU result = \%.30f\n",t2);
    printf("delta = \%.30f\n",(t1-t2));
    return 0;
    }
    SSE result = 0.999999880790710450000000000000
    FPU result = 1.000000000000000000000000000000
    delta = -0.000000119209289550781250000000
    Press any key to continue
      И что удивляет?
        Довольно большая ошибка - 1*10-8 на одно сложение.
        Причем если t выше 0.4098 то все нормально.
        Если это общеизвестный факт то прошу прощения.
          Довольно большая ошибка - 10-7 на одно сложение, причем если t больше 0.4098 то все в порядке.
          Если это общеизвестный факт то прошу прощения и жду ссылку
            Тебя не смущает, что ты пользуешься типом float, в котором длина мантиссы 8 знаков, значит точность представления уже составляет
            0,00000005?
            А смотреть 30 знаков после запятой тоже не стоит по той же причине!
            Плюс к этому, не надо забывать, что вычисления в FPU происходят на уровне 10 байтовых чисел, в SSE - 8 байтовых. Но это уже лирика, главнее же то, что написано сверху!
              Кстати говоря, я прикол такой замечал несколько раз. Отключаешь со-процессор (в Паскале :) - всё Ok, включаешь одни и те же операции, а результаты разные. А это что за глюк?
                Добавлю еще:
                каждая из операций:
                movss xmm0,t
                movss t1,xmm0
                fld t
                fst t2
                имеет погрешность 0,00000005 за счет округления до float!
                Если знаком с математикой, оцени итоговую погрешность, погрешностью FPU и SSE можешь пренебречь, так как меньше более чем на 8 порядков.
                Но как видишь точность FPU и SSE совсем непричем в этом случае.
                В качестве иллюстрации рекомендую поменять тип переменной t2 на long double (10-байтовый вещественный тип, длина мантиссы - 20 знаков), то есть ты увидишь результат таковым, каков он есть в FPU... Думаю, слегка удивишься!
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0275 ]   [ 15 queries used ]   [ Generated: 28.04.24, 09:46 GMT ]