Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.16.66.206] |
|
Сообщ.
#1
,
|
|
|
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 |
Сообщ.
#2
,
|
|
|
И что удивляет?
|
Сообщ.
#3
,
|
|
|
Довольно большая ошибка - 1*10-8 на одно сложение.
Причем если t выше 0.4098 то все нормально. Если это общеизвестный факт то прошу прощения. |
Сообщ.
#4
,
|
|
|
Довольно большая ошибка - 10-7 на одно сложение, причем если t больше 0.4098 то все в порядке.
Если это общеизвестный факт то прошу прощения и жду ссылку |
Сообщ.
#5
,
|
|
|
Тебя не смущает, что ты пользуешься типом float, в котором длина мантиссы 8 знаков, значит точность представления уже составляет
0,00000005? А смотреть 30 знаков после запятой тоже не стоит по той же причине! Плюс к этому, не надо забывать, что вычисления в FPU происходят на уровне 10 байтовых чисел, в SSE - 8 байтовых. Но это уже лирика, главнее же то, что написано сверху! |
Сообщ.
#6
,
|
|
|
Кстати говоря, я прикол такой замечал несколько раз. Отключаешь со-процессор (в Паскале - всё Ok, включаешь одни и те же операции, а результаты разные. А это что за глюк?
|
Сообщ.
#7
,
|
|
|
Добавлю еще:
каждая из операций: movss xmm0,t movss t1,xmm0 fld t fst t2 имеет погрешность 0,00000005 за счет округления до float! Если знаком с математикой, оцени итоговую погрешность, погрешностью FPU и SSE можешь пренебречь, так как меньше более чем на 8 порядков. Но как видишь точность FPU и SSE совсем непричем в этом случае. В качестве иллюстрации рекомендую поменять тип переменной t2 на long double (10-байтовый вещественный тип, длина мантиссы - 20 знаков), то есть ты увидишь результат таковым, каков он есть в FPU... Думаю, слегка удивишься! |